2012-12-20 55 views
1

哪個是使用Python內置函數property()的首選方式?作爲裝飾者還是保存到變量?Python的屬性()應該用作裝飾器還是保存到變量?

下面是將property()保存到變量color的示例。

class Train(object): 
    def __init__(self, color='black'): 
     self._color = color 

    def get_color(self): 
     return self._color 

    def set_color(self, color): 
     self._color = color 

    def del_color(self): 
     del self._color 
    color = property(get_color, set_color, del_color) 

這裏是相同的例子,但使用的裝飾代替。

class Train(object): 
    def __init__(self, color='black'): 
     self._color = color 

    @property 
    def color(self): 
     return self._color 

    @color.setter 
    def color(self, color): 
     self._color = color 

    @color.deleter 
    def color(self): 
     del self._color 

我發現有些人喜歡用只讀屬性的裝飾器語法。例如。

class Train(object): 
    def __init__(self, color='black'): 
     self._color = color 

    @property 
    def color(self): 
     return self._color 

但是,保存到變量時也可以實現相同的功能。

對於相同的功能
class Train(object): 
    def __init__(self, color='black'): 
     self._color = color 

    def get_color(self): 
     return self._color 
    color = property(get_color) 

兩種方式讓我很困惑,因爲PEP20聲明

應該有one--和最好只有一個--obvious辦法做到這一點。

+1

我更喜歡裝飾器語法,因爲它不會創建不應該被調用的額外方法(但直接調用'property()'函數)我不確定這是不是官方首選的方法。 – Matt

+1

有兩種方法的原因是,直到Python 2.4才引入裝飾器,所以在這之前,你的第一個例子是唯一的方法。裝飾器允許更多可讀的代碼,但舊的方式仍然是可能的。 –

+1

感謝@Matt解釋說,裝飾器保護方法,使它們不像'Train().color('green')'那樣可調用。我將從現在開始一直使用裝飾器。 :) –

回答

4

在功能上,這樣做的兩種方式是等價的。裝飾器語法只是語法糖。

@some_decorator 
def some_func(): 
    ... 

...等價於...

def some_func(): 
    .... 
some_func = some_decorator(some_func) 

的修飾語法,使你的代碼更清潔劑(非裝飾語法意味着你必須鍵入「some_func」三次!)和你的意圖更明顯,所以我會說絕對使用裝飾器語法。

+0

謝謝@tom!我將從現在開始只使用裝飾器。一個評論,非裝飾器語法可以(並且[推薦](http://docs.python.org/2/library/functions.html#property))被寫入一個班輪。例如'color = property(get_color,set_color,del_color)' –

+0

是的重新:單行。但是你仍然必須在非裝飾器語法中輸入[color,get_color,set_color,del_color]兩次,而在裝飾器語法中,你只需輸入一次。 – tom

相關問題