Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python忽略属性setter而使用属性getter_Python_Properties - Fatal编程技术网

Python忽略属性setter而使用属性getter

Python忽略属性setter而使用属性getter,python,properties,Python,Properties,我创建了一个具有setter属性的类。使用此类有两种不同的方式,因此某些对象组件的值可能会根据场景以不同的顺序设置(即,我不想在\uuuu init\uuuu期间设置它们)。我在这里包含了一个非属性及其自己的set函数,以说明什么是有效的,什么是无效的 class Dumbclass(object): def __init__(self): self.name = None self.__priority = None @property def priority

我创建了一个具有setter属性的类。使用此类有两种不同的方式,因此某些对象组件的值可能会根据场景以不同的顺序设置(即,我不想在
\uuuu init\uuuu
期间设置它们)。我在这里包含了一个非属性及其自己的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”对象不可调用
。我使用pdb进行了调查,发现它在
self.priority(priority)
处调用getter而不是setter


这是怎么回事?

简短回答:请将您的行
self.priority(priority)
更改为
self.priority=priority

说明:仅当您将某些内容分配给属性时,才会调用Setter。在代码中,您没有执行赋值操作

如果你想了解更多,这里有一些很好的参考资料:


  • 您之所以面临这个问题,是因为您试图在all_the_things方法中将优先级视为一种方法。此时,它已经是一个属性,因此可以像变量一样指定给它:

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

    确认它也发生在python3中。好奇答案是什么。@Travis,当一个赋值操作发生而OP没有做任何赋值操作时,会调用setter。。。如果最终调用属性,为什么要使用
    属性
    ?只需要使用一个普通的方法。那么,如何实际使用setter方法呢?或者更确切地说,什么时候?你能提供一个很好的例子,说明为什么一个人会想费心去做一个单独的二传手吗?
    def all_the_things(self, name, priority=100):
        self.set_name(name)
        self.priority = priority