Python属性和方法重载问题:为何子类属性仍调用基类方法

2 投票
3 回答
2811 浏览
提问于 2025-04-16 02:14

这里有一个例子

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())

撰写回答