【问题标题】:Confusing setter and getter? Why does using the setter throw 'str' object is not callable?混淆 setter 和 getter?为什么使用 setter throw 'str' 对象不可调用?
【发布时间】:2018-07-15 13:00:24
【问题描述】:

我听说使用 set_value()get_value() 之类的 getter 和 setter 函数不是 Pythonic,最好将 property 对象与 setter 和 getter 一起使用。

我运行了下面的代码,我收到了一个错误'str' object is not callable'。当我搜索此错误时,我发现许多代码示例,其中类具有同名的属性和方法(例如,如果我在 __init__ 方法中编写 self.name 而不是 self.__name)。

但我在属性前使用了两个下划线 - 所以这里不应该出现这种情况。看起来当我尝试调用name.setter 时,我实际上调用了一个属性,并接收到存储在self.__name 中的字符串 - 然后我尝试调用其他内容。

但是为什么呢?在 setter 的所有示例中,它们与属性具有相同的名称,并且不会导致问题。为什么会在这里抛出错误,我该如何解决?

class Dog():
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name_in):
        self.__name = name_in

dog = Dog("Barbos")
print(dog.name)                 # this works
dog.name("Juchka")              # and this throws an error: 
                                # TypeError: 'str' object is not callable

【问题讨论】:

  • Setter 的用法如下:dog.name = "Juchka"
  • 有一个 setter 来挂钩 assignment。你会使用dog.name = "Juchka"
  • 你使用 setter 作为dog.name = 'newname'

标签: python class properties setter


【解决方案1】:

您在这里仍然在考虑方法。 不直接调用 setter。相反,当您分配给名称时会调用 setter。

使用赋值:

dog.name = "Juchka"

Python 将其转换为对 setter 方法的调用。

只要访问dog.name就调用getter,getter方法返回一个字符串。调用是与查找对象以应用调用分开的表达式; dog.name("Juchka") 首先执行dog.name,并将("Juchka") 调用表达式应用于该属性查找的结果。属性查找返回"Barbos",而"Barbos"("Juchka")确实不行。

演示:

>>> dog = Dog("Barbos")
>>> dog.name
'Barbos'
>>> 'Barbos'("Juchka")  # what really happens when you try to call dog.name(...)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable
>>> dog.name = "Juchka"
>>> dog.name
'Juchka'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多