@属性 setter 未在 python 3 中调用

@property setter not called in python 3

我有一个大问题,我是 @属性 和 setter 的新手,但我需要将它们用于大学作业:我的问题是 setters总是被 getter 绕过,而且,当我尝试将参数传递给 setter 时,它不起作用:

class DumbClass():
    def __init__(self, classParam):
        self.ciao = classParam

    @property
    def getCiao(self):
        return self.ciao

    @getCiao.setter
    def setCiao(self,dummy):
        self.ciao = dummy

然后,当我调用它时,我有:

pizzo = DumbClass('getter')
pozza = pizzo.getCiao('setter')
print(pizzo.ciao, pozza)

 ----------------------------------------------------------------------
 TypeError Traceback (most recent call last)
 <ipython-input-18-78a6b4607757> in < module>()

       1 pizzo = DumbClass('getter')
 ----> 2 pozza = pizzo.getCiao('setter')
       3 print(pizzo.ciao, pozza)

 TypeError: 'str' object is not callable

或者,如果我不传递任何参数:

pizzo = DumbClass('getter')
pozza = pizzo.getCiao
print(pizzo.ciao, pozza)

----------------------------------------------------------------------
getter getter

我可以让 setter 被调用吗?

你的 属性 名字应该是 ciao 而真正的变量应该是 _ciao 因此,当您执行 self.ciao = ... 时,它将调用 属性

class DumbClass():
    def __init__(self, classParam):
        self.ciao = classParam

    @property
    def ciao(self):
        return self._ciao

    @ciao.setter
    def ciao(self, dummy):
        self._ciao = dummy

setter 仅在您尝试 分配给 属性 时调用。在行

pozza = pizzo.getCiao('setter')

您首先使用 pizzo.getCiao 访问 属性 的值(调用 getter 和 returns 字符串 "getter",然后尝试调用字符串作为带有参数 'setter'.

的函数

您已经基本创建了一个只读属性:

>>> pizzo = DumbClass('getter')
>>> pizzo.getCiao
'getter'
>>> pizzo.getCiao = 'foo'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

这是因为您在定义 getter 和 setter 时没有使用相同的名称,所以您的 属性 没有 setter。 (可以说,getCiao.setter 可能会立即引发错误,因为名称很重要,但事实并非如此。C'est la vie。)

所以正确的做法是为两者使用相同的名称。通常的约定是使用名称为 "same" 的私有变量作为 属性 来存储像这样的简单属性的基础数据。

class DumbClass:
    def __init__(self, p):
        self._ciao = p

    @property
    def ciao(self):
        return self._ciao

    @ciao.setter
    def ciao(self, v):
        self._ciao = v

现在您应该能够获取和设置 属性 的值。

>>> d = DumbClass("hi")
>>> d.ciao
'hi'
>>> d.ciao = 'bye'
>>> d.ciao
'bye'