Python忽略属性设置器而支持属性getter

时间:2016-10-10 19:57:06

标签: python properties

我创建了一个具有setter属性的类。有两种不同的方法可以使用这个类,因此某些对象组件的值可能会根据场景以不同的顺序设置(即我不想在__init__期间设置它们)。我在这里包含了一个非属性的set属性来说明什么是有效的。

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,发现它调用了getter而不是self.priority(priority)的setter。

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

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

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

简答:请将您的专线self.priority(priority)更改为self.priority = priority

说明:只有在为属性分配内容时才会调用Setter。在您的代码中,您没有进行任务操作。

如果您想了解更多信息,请参阅以下内容:

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

答案 1 :(得分:0)

由于尝试将优先级视为all_the_things方法中的方法,因此您遇到此问题。此时它已经是一个属性,因此您可以像变量一样分配它:

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