代码之家  ›  专栏  ›  技术社区  ›  Mark Irvine

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

  •  2
  • Mark Irvine  · 技术社区  · 6 年前

    我试图使用如下的属性设置器。我在这里举个例子: 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 回复  |  直到 6 年前
        1
  •  6
  •   MoxieBall    6 年前

    只需使用 contact.funds = 1000.21 语法。它会用 @funds.setter 是的。

    我不能复制你的 'str' object is not callable 错误,相反我得到一个 'float' object is not callable 错误。更详细地了解它是如何运行的将有助于诊断这一点。不管怎样,原因是 contact.funds 会给你价值 contact._funds ,它不是可调用对象,因此出错。

        2
  •  2
  •   tankthinks    6 年前

    @MoxieBall @pavan 已经显示了语法。我会深入一点来解释到底发生了什么。

    这个 @property decorator正好存在,因此您可以通过 x = object.field object.field = value 语法。所以 @MarkIrvine ,您已正确地执行了所有操作,以启用 contact.funds() 变得更坚强 contact.funds 还有你的 contact.funds(value) 二传手 contact.funds = value 是的。

    困惑在于 @财产 decorator重新定义联系人对象中的符号。换句话说, 联系资金 Descriptor object 是的。一旦你申请了 @funds.setter 装饰工 def funds(self, value): ,和 funds 函数不再像您定义的那样存在。所以 联系资金(价值) 首先返回 联系资金 属性,然后尝试将其作为函数调用。

    希望能有所帮助。=)