使用属性设置器时出现错误“'str'对象不可调用”

时间:2018-06-26 16:51:17

标签: python python-decorators

我正在尝试使用以下属性设置器。我在这里跟随示例: How does the @property decorator work?

class Contact:
    def __init__(self):
        self._funds = 0.00

    @property
    def funds(self):
        return self._funds

    @funds.setter
    def funds(self, value):
        self._funds = value

吸气剂工作正常

>>> contact = Contact()
>>> contact.funds
0.0

但是我缺少关于二传手的东西:

>>> contact.funds(1000.21)

Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1315, in __run
    compileflags, 1) in test.globs
  File "<doctest __main__.Contact[2]>", line 1, in <module>
    contact.funds(1000.21)
TypeError: 'str' object is not callable

我在这里做什么错了?

2 个答案:

答案 0 :(得分:6)

只需使用String id = mod.getId(); 语法。它将使用contact.funds = 1000.21进行设置。

我无法重现您的@funds.setter错误,而是出现了'str' object is not callable错误。有关如何运行的更多详细信息将有助于诊断。无论如何,原因是'float' object is not callable会给您返回contact.funds的值,该值不是可调用的对象,因此会出错。

答案 1 :(得分:2)

@MoxieBall@pavan已经显示了语法。我会更深入地介绍发生的事情。

@property装饰器确实存在,因此您可以通过方便的x = object.fieldobject.field = value语法获取和设置对象字段。因此,@MarkIrvine已正确完成了所有操作,以使您的contact.funds()吸气剂成为contact.funds,并使您的contact.funds(value)的吸毒者成为contact.funds = value

混淆之处在于@property装饰器重新定义了联系人对象中的符号。换句话说,contact.funds Descriptor object。将@funds.setter装饰器应用于def funds(self, value):之后,funds函数在您定义时不再存在。因此,contact.funds(value)首先返回contact.funds属性,然后尝试像调用函数一样调用它。

希望有帮助。 =)