@属性 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'
我有一个大问题,我是 @属性 和 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'