Python属性和方法重载问题:为何子类属性仍调用基类方法
这里有一个例子
class A(object):
def f1(self):
return []
test1 = property(f1)
class B(A):
def f1(self):
return [1, 2]
if __name__ == "__main__":
b = B()
print b.test1
我本来希望输出是 [1, 2],但结果却是 []。
这跟我预想的完全不一样。
我在代码里是不是犯了什么错误?如果没有的话,我想这可能是因为当属性 test1 被创建时,它绑定到了基类 A 的 f1 函数上。那么,有什么可能的替代实现可以达到我想要的结果呢?
3 个回答
1
我想到几个替代方案:可以在子类中重复调用一下 property
,
class B(A):
def f1(self):
return [1,2]
test1 = property(f1)
或者可以让这个属性依赖于另一个方法,这个方法会调用 f1
:
class A(object):
def f1(self):
return []
def _f1(self):
return self.f1()
test1 = property(_f1)
3
我想这之所以这样工作,是因为当属性 test1 被创建时,它绑定到了基类 A 的 f1 函数上。
说得完全正确。
有什么可能的替代实现方法来达到我想要的效果吗?
可以增加一个间接层:
class A(object):
def f1(self): return []
def _f1(self): return self.f1()
test1 = property(_f1)
class B(A):
def f1(self): return [1, 2]
6
如果你不想让类的命名空间变得杂乱,可以使用一个lambda函数来延迟查找f1
。
class A(object):
def f1(self):
return []
test1 = property(lambda x:x.f1())