我正在使用属性函数创建成员,但是当我尝试覆盖这些属性的 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'
如果您只想为A
或B
返回不同的常量字符串,那么您根本不需要属性:
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)