Python переменные и функции имеют одно и то же пространство имен. Таким образом, self.color
может ссылаться только на метод получения / установки или на сам атрибут. Общепринятым соглашением является добавление подчеркивания к внутреннему имени атрибута, чтобы избежать этого наименования cla sh, которое также условно передает понятие, что это закрытый атрибут.
Это должно уже объяснить ваш другой вопрос. Если у вас есть метод с именем self.color
и он содержит код, в котором он заменяет сам значением, то, конечно, вы больше не можете использовать self.color
для повторной ссылки на метод.
Давайте посмотрим на это еще раз с еще более простым примером.
>>> class X:
... def color (self, value):
... self.color = value
При первом вызове функции - скажем, xinstance.color("red")
- она установит color
экземпляра в "red"
. Поэтому вы больше не можете вызывать xinstance.color()
снова, потому что теперь это строка, а не функция.
Добавление декоратора @property
несколько меняет это, потому что теперь self.color = value
вызовет color
для вызова сам, что заставляет его называть себя, что заставляет его снова вызывать себя, и т. д. c.