Установщик @property не вызывается в Python 3 - PullRequest
0 голосов
/ 15 ноября 2018

У меня большая проблема, я новичок с @property и сеттером, но мне нужно использовать их для университетского задания: моя проблема в том, что сеттеры всегда игнорируются геттерами, а также, когда я пытаюсь передать аргумент для установщика, он не работает:

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 голосов
/ 15 ноября 2018

Сеттер вызывается только при попытке присвоить свойству.В строке

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'
0 голосов
/ 15 ноября 2018

Имя вашего свойства должно быть 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
...