2010-08-03 59 views
2

下面是一个例子Python的属性和方法覆盖的问题:为什么子类物业仍调用基类的方法

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

BTW,为什么CW一个完美的技术问题容易受到尖锐,同样的技术答案?我在发现CW标签之前做出了回应 - 但是,我讨厌并且通常避免错误标记的问题(CW当他们明显不应该,反之亦然)。 – 2010-08-03 04:39:21

回答

6

可以推迟f1与lambda函数查找,如果你不希望污染类的命名空间

class A(object): 

     def f1(self): 
       return [] 

     test1 = property(lambda x:x.f1()) 
3

我想是这样工作的,因为 创建性能测试1时, 绑定到 基类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] 
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)