2016-12-11 34 views
2

從其中一個博客,我有以下代碼,我正在使用它來了解python property的工作。瞭解Python屬性的工作

class Celsius: 
    def __init__(self, temperature = 0): 
     self._temperature = temperature 

    def to_fahrenheit(self): 
     return (self.temperature * 1.8) + 32 

    @property 
    def temperature(self): 
     print("Getting value") 
     return self._temperature 

    @temperature.setter 
    def temperature(self, value): 
     if value < -273: 
      raise ValueError("Temperature below -273 is not possible") 
     print("Setting value") 
     self._temperature = value 

Q1:在__init__方法,爲什麼用self._temperature作者。它應該不是self.temperature?控制權將如何去@temperature.setter

+0

我希望你在python 3下運行python 2,你需要從'object'繼承你的類。 「 – Anthon

+1

」該控件將如何轉到「@ temperature.setter」? - 它不會。 – user2357112

回答

2

__init__()中使用self._temperature是否正確有時是品味的問題。實質上,現在有第三種方法(除了settergetter)知道存儲實際值的屬性。國際海事組織,這是不好的,並可能導致錯誤,如果你重構類和改變屬性,但它本身並不正確。

可能會出現這種情況,setter已經假設一個值以其他方式存儲。不在這裏,但例如如果self._temperature只在增加時才設置。在這種情況下,您必須直接訪問該屬性。 (這種情況可以通過在setter和getter中使用hasattr(self, "_temperature")測試「存儲」屬性存在並適當地初始化來規避)。

從來沒有控制權轉移給制定者的問題。如果你做的setter被使用:

self.temperature = some_value 

你總是可以直接設置「隱藏」屬性(在這種情況下self._temperate)從任何其他方法(或直接訪問上的Celsius實例的屬性)。請注意,這恰好是在它之前帶有下劃線的屬性名稱,它可以是任何(免費)名稱。