如何在python中覆盖属性函数的setters和getter?



我正在使用属性函数创建成员,但是当我尝试覆盖这些属性的 setter 和 getter 时,它总是引用父类的 setter 和 getters:

class A():
def evaluate(self):
return 'A'
value = property(evaluate)
class B(A):
def evaluate(self):
return 'B'
b = B()
print(b.value) # I get 'A'

我试图将值成员的定义放在父级的构造函数中,例如:

self.value = property(self.evaluate)

但是当访问对象的值时,它返回一个属性对象而不是实际值,例如:"A"或"B"。

<property object at 0x7fecd01a88b8>

我知道如何解决此问题,但我想知道是否可以使用属性函数/装饰器并且无需代码重复即可解决它。

问题是表达式property(evaluate)将属性绑定到执行A的类体时作用域中的evaluate函数。要执行所需的操作,您必须延迟访问evaluate,直到使用该属性。

这将起作用,但如果我们知道您为什么要这样做,那么可能有一个更好的方法:

class A():
def evaluate(self):
return 'A'
value = property(lambda self: self.evaluate())
class B(A):
def evaluate(self):
return 'B'
b = B()
print(b.value) # prints 'B'

如果您只想为AB返回不同的常量字符串,那么您根本不需要属性:

class A():
value = 'A'
class B(A):
value = 'B'
b = B()
print(b.value)

如果你真的需要一个属性,那么只需在子类中重新定义该属性:

class A():
@property
def value(self):
return 'A'
class B(A):
@property
def value(self):
return 'B'
b = B()
print(b.value)

最新更新