在python 3中未调用@property setter

时间:2018-11-15 15:43:21

标签: python python-3.x setter getter python-decorators

我有一个大问题,我是@property和setter的新手,但是我需要将它们用于大学作业:我的问题是,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

我可以叫二传手吗?

2 个答案:

答案 0 :(得分:2)

您的媒体资源名称应为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

答案 1 :(得分:0)

仅当您尝试分配该属性时才调用设置器。在行中

pozza = pizzo.getCiao('setter')

您首先使用pizzo.getCiao(调用getter并返回字符串"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可能会立即引发错误,因为名称很重要,但这并不重要。请耐心等待。)

所以正确的做法是为两者使用相同的名称。通常的惯例是使用一个具有“相同”名称的私有变量作为属性来存储像这样的简单属性的基础数据。

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'