Существует альтернатива, использующая super
, которая не требует явной ссылки на имя базового класса.
Базовый класс A:
class A(object):
def __init__(self):
self._prop = None
@property
def prop(self):
return self._prop
@prop.setter
def prop(self, value):
self._prop = value
class B(A):
# we want to extend prop here
pass
В B доступ к получателю свойства родительского класса A:
Как уже ответили другие, это:
super(B, self).prop
Или в Python 3:
super().prop
Возвращает значение, возвращаемое получателем свойства, а не самим получателем, но его достаточно для расширения получателя.
В B доступ к установщику свойств родительского класса A:
Лучшая рекомендация, которую я видел до сих пор:
A.prop.fset(self, value)
Я считаю, что этот лучше:
super(B, self.__class__).prop.fset(self, value)
В этом примере оба варианта эквивалентны, но преимущество super в том, что они независимы от базовых классов B
. Если B
наследуется от класса C
, также расширяющего свойство, вам не нужно обновлять код B
.
Полный код B, расширяющий свойство A:
class B(A):
@property
def prop(self):
value = super(B, self).prop
# do something with / modify value here
return value
@prop.setter
def prop(self, value):
# do something with / modify value here
super(B, self.__class__).prop.fset(self, value)
Одна оговорка:
Если ваше свойство не имеет установщика, вы должны определить и установщик, и получатель в B
, даже если вы измените поведение только одного из них.