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, но я знаю, что это неправильный путь. Есть ли другой способ?






Это связано с тем, что когда вы присваиваете Base.prop с помощью property(get_prop, set_prop), этот объект property создается с помощью объекта функции set_prop, как определено в классе Base. Тот факт, что класс 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
Я обновил свой ответ некоторыми возможными решениями.
Значит, единственный способ — повторить этот
prop = property(get_prop, set_prop)вDerivedклассе?