簡體   English   中英

Python忽略屬性設置器而支持屬性獲取器

[英]Python ignoring property setter in favor of property getter

我創建了一個具有帶有setter屬性的類。 有2種不同的方法可以使用此類,因此某些對象組件的值可以根據情況以不同的順序設置(即,我不想在__init__期間設置它們)。 我在這里包含了一個非財產及其自身的設定函數,以說明什么是有效的,什么是無效的。

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)

這里發生了什么?

簡短答案:請將行self.priority(priority)更改為self.priority = priority

說明:僅當您向屬性分配某些內容時,才調用Setter。 在您的代碼中,您沒有執行賦值操作。

如果您想了解更多,這里有一些不錯的參考資料:

  1. Python描述符
  2. @property裝飾器如何工作?
  3. 現實生活中的例子

由於要在all_the_things方法中將優先級視為一種方法,因此您遇到了此問題。 此時,它已經是一個屬性,因此您可以像分配變量一樣將其分配給它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM