繁体   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