簡體   English   中英

Python屬性和方法覆蓋問題:為什么子類屬性仍然調用基類的方法

[英]Python property and method override issue: why subclass property still calls the base class's method

這是一個例子

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函數。有什么可能的替代實現來實現我想要的?

如果您不希望污染類命名空間,可以使用lambda函數推遲f1的查找

class A(object):

        def f1(self):
                return []

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

我認為它的工作原理是這樣的,因為當創建屬性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]

我能想到的幾個替代方案:要么重復對子類中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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM