代码之家  ›  专栏  ›  技术社区  ›  Bob Cross n8wrl

python属性和方法重写问题:为什么subclass属性仍然调用基类的方法

  •  2
  • Bob Cross n8wrl  · 技术社区  · 5 年前

    下面是一个例子

    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 回复  |  直到 12 年前
        1
  •  6
  •   John La Rooy    14 年前

    您可以推迟查找 f1 如果不希望污染类命名空间,则使用lambda函数

    class A(object):
    
            def f1(self):
                    return []
    
            test1 = property(lambda x:x.f1())
    
        2
  •  3
  •   Alex Martelli    14 年前

    我想是这样的,因为 创建属性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]
    
        3
  •  1
  •   David Z    14 年前

    我可以想到两种选择:要么重复呼叫 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)