2016-10-10 72 views
1

我創建了一個具有setter屬性的類。有兩種不同的方式來使用這個類,所以一些對象組件的值可以根據場景以不同的順序設置(即,我不想在__init__期間設置它們)。我已經在這裏包含了一個非財產和它自己的函數來說明什麼是和不在工作。Python忽略屬性獲取者的屬性設置器

class Dumbclass(object): 

    def __init__(self): 
    self.name = None 
    self.__priority = None 

    @property 
    def priority(self): 
    return self.__priority 

    @priority.setter 
    def priority(self, p): 
    self.__priority = p 

    def set_name(self, name): 
    self.name = "dumb " + name 

    def all_the_things(self, name, priority=100): 
    self.set_name(name) 
    self.priority(priority) 

    print self.name 
    print self.priority 

當我運行以下,它返回TypeError: 'NoneType' object is not callable。我用pdb進行了調查,發現它在self.priority(priority)處調用getter而不是setter。

if __name__ == '__main__': 
    d1 = Dumbclass() 
    d1.all_the_things("class 1") 

    d2 = Dumbclass() 
    d2.all_the_things("class 2", 4) 

這是怎麼回事?

+0

確認它發生在python3以及。好奇答案是什麼。 –

+0

@Travis,setter在調用操作發生時調用,OP沒有執行任何賦值操作 –

+0

...如果最終調用屬性,爲什麼要使用「property」?只需使用正常的方法。 – Bakuriu

回答

2

答案很簡單:請改變你的線self.priority(priority)self.priority = priority

說明:只有當你分配的東西的屬性二傳手被調用。在你的代碼中,你沒有做一個賦值操作。

這裏有一些很好的參考,如果你想了解更多:

  1. Python descriptors
  2. How does the @property decorator work?
  3. Real Life Example
+0

你能否提供一個很好的例子,說明爲什麼人們想要製造一個單獨的二傳手? – kimash

0

您都面臨這個問題,由於試圖把優先級爲方法在你的all_the_things方法中。在這一點上它已經是一個屬性,所以你分配它像一個變量:

def all_the_things(self, name, priority=100): 
    self.set_name(name) 
    self.priority = priority 
+0

那麼如何實際使用setter方法呢?或者說,什麼時候? – kimash

+0

@kimash,看我更新的答案 –