2013-12-13 55 views
6

好的我一直在閱讀關於在Python中使用@property裝飾器,而不是用於獲取,設置和刪除的特定方法。下面顯示了一些示例代碼。在Python中自動設置getter,setter和deleter

class Person(object): 

    def __init__(self): 

     self._firstName = None 
     self._lastName = None 
     self._age = None 

    @property 
    def firstName(self): return self._firstName 
    @firstName.setter 
    def firstName(self, val): self._firstName = val 
    @firstName.deleter 
    def firstName(self): del self._firstName 

    @property 
    def lastName(self): return self._lastName 
    @lastName.setter 
    def lastName(self, val): self._lastName = val 
    @lastName.deleter 
    def lastName(self): del self._lastName 

    @property 
    def age(self): return self._age 
    @age.setter 
    def age(self, val): self._age = val 
    @age.deleter 
    def age(self): del self._age 

Peter = Person() 

Peter.firstName = 'Peter' 
Peter.lastName = 'Smith' 
Peter.age = 21 

print ' '.join([Peter.firstName, Peter.lastName]) 

正如您所看到的,該示例中的大部分代碼都致力於定義方法。

我的問題是是否有一種方法可以爲我的每個變量自動分配getter,setter和deleter?在我的實際代碼中,我有更多的變量,它似乎是很多重複代碼設置每種方法。

我意識到,對於簡單的情況,它可能不是嚴格必要的,但我更願意現在編寫方法,以防萬一我決定增加類的複雜性。

+3

*「不過,如果我決定增加課程的複雜性,我寧願現在編寫方法。」* - 爲什麼不在需要時添加它們?只實現你現在需要的*,然後在代碼增長時重構。您現在添加的用於支持可能發生或可能不會發生的擴展或功能的所有內容都只是噪聲。 –

回答

3

保持簡單。

如果你有這樣的功能,只需使用一個可公開訪問的變量。那就是:

class Person(object): 
    def __init__(self): 
     self.firstName = None 
     self.lastName = None 
     self.age = None 

是非常好的。考慮到使用更好的方法是,要求數據作爲構造的一部分,即:

class Person(object): 
    def __init__(self, firstName, lastName, age): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.age = None 

person = Person('Peter', 'Smith', 21) 

如果你關心哪個名字是哪個,你總是可以具體:

person = Person(firstName='Peter', lastName='Smith', age=21) 

在未來,如果你需要使它更復雜,你可以在需要的地方添加getters/setters。

另一個考慮是,給出的構造函數,你可以在Person對象上創建一個字符串轉換功能:

def __str__(self): 
    return ' '.join([self.firstName, self.lastName]) 

這就可以讓你用它喜歡:

person = Person(firstName='Peter', lastName='Smith', age=21) 
print(person) 

,所以你不要不需要知道它是如何在內部實施的。

另一個考慮因素是中文/日文名字首先將姓氏放在姓氏上,人們可以有多個姓氏(特別是在西班牙)並且可以有中間名字。

2

屬性修飾器的整點是讓你不需要需要從一開始就定義它。直接訪問屬性與通過屬性訪問屬性的語法完全相同。所以你應該徹底拋棄它,直到你確實擁有複雜的邏輯,然後才改變屬性。

0

手動設置器和刪除器定義是一種明確的方式:「我花了很多時間創建此接口,並且可以自由設置,刪除和獲取此屬性,而不用擔心破壞代碼」。

否則,你可以簡單地使用沒有屬性裝飾器的實例變量。

def __init__(self): 

    self.firstName = None 
    self.lastName = None 
    self.age = None 

在一個側面說明,你可能要採取PEP-8的外觀爲Python的變量命名和編碼風格公約。