Ошибка "объект str не вызывается" при использовании установщика свойств - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь использовать установщик свойств, как показано ниже. Я следую примеру здесь: Как работает @property Decorator?

class Contact:
    def __init__(self):
        self._funds = 0.00

    @property
    def funds(self):
        return self._funds

    @funds.setter
    def funds(self, value):
        self._funds = value

Геттер отлично работает

>>> contact = Contact()
>>> contact.funds
0.0

но мне что-то не хватает в сеттере:

>>> contact.funds(1000.21)

Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1315, in __run
    compileflags, 1) in test.globs
  File "<doctest __main__.Contact[2]>", line 1, in <module>
    contact.funds(1000.21)
TypeError: 'str' object is not callable

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

@ MoxieBall и @ pavan уже показали синтаксис. Я углублюсь немного глубже, чтобы объяснить, что происходит.

Декоратор @property существует точно, так что вы можете получить и установить поля объекта с помощью удобного синтаксиса x = object.field и object.field = value. Итак, @ MarkIrvine , вы сделали все правильно, чтобы ваш геттер contact.funds() стал contact.funds, а сеттер contact.funds(value) - contact.funds = value.

Путаница заключается в том, что декоратор @property переопределяет символы в ваших контактных объектах. Другими словами, contact.funds - это a Дескриптор объекта . После применения декоратора @funds.setter к def funds(self, value): функция funds больше не существует, как вы ее определили. Поэтому contact.funds(value) сначала возвращает свойство contact.funds, а затем пытается вызвать его, как если бы это была функция.

Надеюсь, это поможет. =) * * Тысяча тридцать одна

0 голосов
/ 26 июня 2018

Просто используйте синтаксис contact.funds = 1000.21. Он установит его, используя @funds.setter.

Я не могу воспроизвести вашу ошибку 'str' object is not callable, скорее я получаю ошибку 'float' object is not callable. Более подробная информация о том, как он выполняется, будет полезна для диагностики этого. Несмотря на это, причина в том, что contact.funds вернет вам значение contact._funds, которое не является вызываемым объектом, следовательно, ошибка.

...