python super()多繼承問題
當乙個類繼承多個類時,如下,輸出的是什麼?
答案是報錯,找不到self.age的屬性,因為son只會繼承從左到右繼承,且只會繼承第乙個父類的構造方法__init__,如果最左邊沒有找到構造方法,才會往右邊查詢。但是如果son類想同時呼叫father與gfather的__init__()呢?
答案是super,super的一大好處在於,當父類的名字修改時,其繼承類不用修改呼叫方法。而顯示呼叫同樣能達到目的,但是不夠好。
上述**執行結果
執行順序是先執行son的init,然後按從左到右繼承順序執行father和gfather的init,而建構函式執行完,為什麼先執行的是gfather-》father-》son?
這裡就涉及到了mro。mro全稱method resolution order, 就是用來定義繼承方法的呼叫順序,自python2.3以來,mro採用廣度優先(區別於深度優先)的規則定義。按廣度優先的規則,出來的順序就是:
son-》father-》gfather-》type 『object』
而每次呼叫super()則是,呼叫mro中下乙個函式。上面的例子中:super(son, self)則指向mro中的下乙個類(father), 於是呼叫father的init --> 在father的init中,又呼叫了super(),於是呼叫mro中的下乙個函式(gfather) --> gfather呼叫下乙個(object), object啥也不幹 --> 返回gfather中,print(class)就是 gfather–> 返回father中,print(class) 即father --> 返回son中,print(class)即 son。
繼承 多繼承
一 繼承 1 封裝 self引數傳入的是建立的物件,self可以直接將物件帶引數傳入類中方法,這種在物件中封裝資料,對類進行了優化的方法就叫封裝。2 當乙個繼承自另乙個累的時候,會先去子類裡面找,如果有先呼叫沒有去夫類找。1 class rectangle 矩形類 def init self,len...
繼承 多繼承
繼承 父類 基類 新內容 子類 派生類 子類繼承父類,子類繼承父類所有的成員變數和成員函式 父類有的子類都有,子類沒有的可以加 繼承方式 控制父類成員在子類中的訪問許可權 public private protected 格式 calss 子類 許可權 父類 規則 繼承方式 public 父類私有成...
Python Super關鍵字子類繼承父類
參考 class father def init self print 這是父類的 class son father def init self father.init self print 這是子類的 son son 這是父類的 這是子類的注 在子類中呼叫父類方法時,要傳入self這一引數,相當於...