Python属性和方法覆盖问题:为什么子类属性仍然调用基类的方法

时间:2010-08-03 04:13:04

标签: python inheritance properties

这是一个例子

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 个答案:

答案 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)