Сеттер вызывается только при попытке присвоить свойству.В строке
pozza = pizzo.getCiao('setter')
вы сначала получаете доступ к значению свойства с помощью pizzo.getCiao
(который вызывает метод получения и возвращает строку "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
Это потому, что вы не использовали одно и то же имя при определении как получателя, так и установщика, поэтому ваше свойствоне имеет установщика. (Возможно, getCiao.setter
, вероятно, должен сразу вызвать ошибку, так как имя имеет значение, но это не так. C'est la vie.)
Так что правильноdo использует одно и то же имя для обоих. Обычное соглашение - использовать личную переменную с тем же именем в качестве свойства для хранения базовых данных для простых свойств, подобных этому.
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'