【问题标题】:Python property and method override issue: why subclass property still calls the base class's methodPython属性和方法覆盖问题:为什么子类属性仍然调用基类的方法
【发布时间】:2011-03-24 12:57:11
【问题描述】:

这是一个例子

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 函数。实现我想要的可能的替代实现是什么?

【问题讨论】:

  • 顺便说一句,为什么 CW 是一个完美的技术问题,容易受到尖锐和同样技术性答案的影响?!我在发现 CW 标签之前做出了回应——但是,我讨厌并且通常会避免被错误标记的问题(显然不应该是 CW,反之亦然)。

标签: python inheritance properties


【解决方案1】:

我想它是这样工作的,因为 当创建属性 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】:

    我能想到的几种选择:或者在子类中重复调用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】:

      如果您不想污染类命名空间,可以使用 lambda 函数延迟查找 f1

      class A(object):
      
              def f1(self):
                      return []
      
              test1 = property(lambda x:x.f1())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-22
        • 2019-07-25
        • 2021-03-27
        • 1970-01-01
        相关资源
        最近更新 更多