python的__mro__與__slot__


python支持多重繼承,在解析父類的__init__時,定義解析順序的是子類的__mro__屬性,內容為一個存儲要解析類順序的元組。

 

class A(object):
    def __init__(self):
        print '    -> Enter A'
        print '    <- Leave A'

class B(A):
    def __init(self):
        print '    -> Enter B'
        # A.__init__(self)
        super(B, self).__init__()
        print '    <- Leave B'

class C(A):
    def __init__(self):
        print "    -> Enter C"
        # A.__init__(self)
        super(C, self).__init__()
        print "    <- Leave C"

class D(B, C):
    def __init__(self):
        print "    -> Enter D"
        # B.__init__(self)
        # C.__init__(self)
        super(D, self).__init__()
        print "    <- Leave D"

if __name__ == "__main__":
    d = D()
    print "MRO:", [x.__name__ for x in D.__mro__]
    print type(D.__mro__)

執行以上代碼,得到的輸出為:

-> Enter D
-> Enter C
-> Enter A
<- Leave A
<- Leave C
<- Leave D
MRO: ['D', 'B', 'C', 'A', 'object']
<type 'tuple'>

 

與之前一篇文章中的內容不同,類B並沒有被執行,也許是因為沒有顯式調用,而C與B有相同父類。

盡量避免使用非綁定方法,可能會造成重復調用。

 

關於__slot__

__slot__定義類中可以被外界訪問的屬性,類似node中的exports。

當父類中定義了__slot__時,不能向父類中添加屬性。如果子類中沒有定義__slot__,則子類不受父類__slot__定義的限制。

如果父類與子類中都定義了__slot__,則郵箱的結果為父類與子類__slot__的合集。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM