2015-07-20 44 views
1

我有一個類MyLib中與變量x。我不在課堂外使用這個變量,但是我從包裏的另一個課程開始設置它。我想知道什麼是將值設置爲下面的變量x的首選方法。 我應該直接設置它爲顯示在下面的代碼段或 應創建@property和@ x.setter函數來設置它。使用@屬性與存取變量直接

class MyLib: 
    def __init__(self, *args, **kwargs) 
     self._x = None 
    def func_to_process_x(): 
     # do something 

class UseLib: 
    self._x = 'ABC' 

注意:這個問題不關於使用屬性而不是getter和setter。相反,我想知道,如果我們可以直接使用變量,那麼最好使用屬性/ getter/setter,因爲在Python中什麼都不是私有的。 而且是推薦使用,即使屬性時,我不是在@x.setter功能從簡單的分配值的變量做任何事情分開。基本上想知道屬性的開銷是否值得以封裝的名義(儘管它不是純粹意義上的封裝,因爲沒有什麼是私有的,請糾正我,如果我在這裏是錯誤的)

+0

@ Rvdk。感謝您的鏈接。但是這個問題更多地討論了屬性與吸氣和吸氣的關係。我更關心直接訪問變量,而不是使用屬性或getattr/setattr或任何其他自定義getters/setters – rdp

+0

我仍在等待這一個答案。蟒蛇專家請貢獻? – rdp

回答

4

這很簡單:避免屬性爲只要你不需要它們。有人可能會遇到來自人下面的代碼誰只是從C++,C#或Java切換到Python:

class C: 
    _x = None 

    @property 
    def x(self): 
     return self._x 

    @x.setter 
    def x(self, value): 
     self._x = value 

而且第一個問題:爲什麼?爲了尋找「OOPish」?沒有什麼是由上面的代碼中,有什麼不可能通過做實現:

class C: 
    x = None 

也就是說Python的性能之美:你可以交換可變版本屬性,而類API用戶不用知道了。可能有任何原因,例如日誌記錄,驗證,業務邏輯等:

class C: 
    ... 
    ... 
    @x.setter 
    def x(self, value): 
     self._x = value 
     log('x set to {}'.format(value)) 

底線:使用變量,當你需要截取的變量被讀取和/或寫入切換到性能。