我有一个大问题,我是@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
我可以叫二传手吗?
答案 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'