2013-03-07 60 views
3

我寫一個類的方法,我想用類變量,如果提供默認爲python類方法中的類變量?

def transform_point(self, x=self.x, y=self.y): 

沒有其他的值,但...這似乎並不工作:

NameError: name 'self' is not defined 

我感覺有一個更聰明的方法來做到這一點。你會怎麼做?

回答

5

您需要使用定點值,然後替換那些具有所需的實例屬性。 None是一個很好的選擇:

def transform_point(self, x=None, y=None): 
    if x is None: 
     x = self.x 
    if y is None: 
     y = self.y 

注意函數簽名只執行一次;你不能使用表達式作爲默認值,並期望每次調用函數都會改變它們。

如果能夠設置xyNone,那麼你需要使用一個不同的,獨特的單值設置爲默認。使用的object()實例通常在這種情況下,一個偉大的哨兵:

_sentinel = object() 

def transform_point(self, x=_sentinel, y=_sentinel): 
    if x is _sentinel: 
     x = self.x 
    if y is _sentinel: 
     y = self.y 

,現在你可以調用.transform_point(None, None)了。

2
def transform_point(self, x=None, y=None): 
    if x is None: 
     x = self.x 
    if y is None: 
        y = self.y 

+1

請注意,調用'transform_point(obj)'將導致對'transform_point'的所有後續調用對'x'和'y'使用默認的arg'None'。 – mmoore 2013-03-07 12:18:22