这是一个例子
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函数。什么是实现我想要的可能的替代实现?
答案 0 :(得分:6)
如果您不希望污染类名称空间,可以使用lambda函数推迟f1
的查找
class A(object):
def f1(self):
return []
test1 = property(lambda x:x.f1())
答案 1 :(得分:3)
我认为它的工作原理是这样的 当创建属性test1时,它 必然是f1的功能 基础A。
完全正确。
什么是可能的替代方案 实现实现我想要的目标?
另一个间接层:
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]
答案 2 :(得分: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)