我想覆盖子类中属性的getter和setter。请考虑以下python3代码段:
class Base():
@property
def value(self):
return "Base.value"
@value.setter
def value(self, value):
pass
class Child(Base):
@Base.value.getter
def value(self):
return "Child.value"
@Base.value.setter
def value(self, value):
pass
c = Child()
print(c.value)
此程序打印Base.value
,表示value
getter未被覆盖。但是,如果我删除value
类中的Child
setter,程序将打印Child.value
,这意味着将覆盖getter。
这种覆盖属性的方法有什么问题?为什么修改setter会改变getter的行为?我怎样才能正确覆盖子类中的getter和setter?
答案 0 :(得分:1)
根据我的观察,如果只需要覆盖setter(或getter),我认为你应该使用@ Base.value.setter(或.getter)装饰器。
如果必须覆盖两者,只需使用通常的@property方法。
class Base():
def __init__(self):
self._value = 'Value'
@property
def value(self):
print('Base.Getter')
return f'Base.{self._value}'
@value.setter
def value(self, value):
print('Base.Setter')
self._value = value
class Child(Base):
@property
#@Base.value.getter
def value(self):
print('Child.Getter')
return f'Child.{self._value}'
@value.setter
#@Base.value.setter
def value(self, value):
print('Child.Setter')
self._value = value
b, c = Base(), Child()
print(b.value)
print(c.value)
b.value = 'test.base'
c.value = 'test.child'
print(b.value)
print(c.value)
打印:
Base.Getter
Base.Value
Child.Getter
Child.Value
Base.Setter
Child.Setter
Base.Getter
Base.test.base
Child.Getter
Child.test.child