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__的合集。