Используйте только.getter
декоратора оригинального объекта:
class superhuman(human):
@human.name.getter
def name(self):
return 'super ' + self._name
Обратите внимание, что вы должны использовать полное имя, чтобы достичь первоначального дескриптор свойства на родительском классе.
Демонстрация:
>>> class superhuman(human):
... @human.name.getter
... def name(self):
... return 'super ' + self._name
...
>>> s = superhuman('john')
>>> print s.name
super john
>>> s.name = 'jack'
>>> print s.name
super jack
Объект property
дескриптора просто один объект, даже если он может иметь несколько методов, связанных с ней (геттер, инкубационного и DeleteR). Функции декоратора .getter
, .setter
и .deleter
, предоставленные существующим дескриптором property
, возвращают копию самого дескриптора с заменой одного конкретного метода.
Так что в вашем human
базовом классе, что происходит, что вы первый создать дескриптор с @property
декоратора, а затем заменить этот дескриптор с той, которая имеет как геттер и сеттер с синтаксисом . Это работает, потому что декораторы python заменяют оригинальную украшенную функцию с тем же именем, она в основном выполняет name = name.setter(name)
. См. How does the @property decorator work? для получения подробной информации о том, как все это работает.
В вашем подклассе вы просто используете этот трюк, чтобы создать новую копию дескриптора с замененным геттером.