#python #python-3.x #inheritance #properties
#python #python-3.x #наследование #свойства
Вопрос:
class Base:
def __init__(self):
self._prop = None
pass
def get_prop(self):
print('base get prop')
return self._prop
def set_prop(self, prop):
print('base set prop')
self._prop = prop
prop = property(get_prop, set_prop)
pass
class Derived(Base):
def set_prop(self, prop):
print('Derived set prop')
self._prop = prop
pass
base = Base()
base.prop = 1
print(base.prop)
derive = Derived()
derive.prop = 1
print(derive.prop)
Результат:
base set prop
base get prop
1
base set prop
base get prop
1
Ожидаю получить, Derived set prop
поскольку я переопределяю его в производном классе.
Когда я погуглил это, я увидел аннотирование с помощью @Base.prop.setter
. Я тоже пробовал это, но это не сработало. Я думаю, это потому, что способ, которым они создают Base
‘s prop
, отличается.
Но я не могу легко обновить Base
класс в этой ситуации.
Один из способов — полностью повторно реализовать prop
в Derive
классе, но я знаю, что это неправильный способ. Есть ли другой способ?
Ответ №1:
Это происходит потому, что при назначении Base.prop
с property(get_prop, set_prop)
помощью property
этот set_prop
объект создается с помощью объекта Base
function, как определено в классе. Тот факт, что Derived
класс наследует Base
класс, волшебным образом не обновляет ссылку на Base.set_prop
метод внутри property
объекта.
Вы можете либо определить другой prop
внутри Derived
класса:
class Derived(Base):
def set_prop(self, prop):
print('Derived set prop')
self._prop = prop
prop = property(Base.get_prop, set_prop)
или вы можете просто использовать property
в качестве декоратора:
class Base:
def __init__(self):
self._prop = None
pass
@property
def prop(self):
print('base get prop')
return self._prop
@prop.setter
def prop(self, prop):
print('base set prop')
self._prop = prop
class Derived(Base):
@Base.prop.setter
def prop(self, prop):
print('Derived set prop')
self._prop = prop
Комментарии:
1. Итак, единственный способ — повторно запустить это
prop = property(get_prop, set_prop)
вDerived
классе?2. Я обновил свой ответ некоторыми возможными решениями.