一、定義
python面對物件的繼承指的是多個類之間的所屬關系,即子類默認繼承父類的所由屬性和方法,
class A(object): def __init__(self): self.num=1 def info_print(self): print(self.num) #子類B class B(A): pass resoult=B() resoult.info_print() #1
二、單繼承和多繼承
- 單繼承:
- 多繼承:一個類同時繼承多個父類
P.s:當一個類有多個父類得時候,同名屬性和方法默認使用第一個父類的,
class A(object): def __init__(self): self.str = 'A類的初始定義' def print_str(self): print(f'運用{self.str}') class B(object): def __init__(self): self.str = 'B類的初始定義' def print_str(self): print(f'運用{self.str}') class C(A, B): pass class D(B, A): pass c = C() c.print_str() # 運用A類的初始定義 d = D() d.print_str() # 運用B類的初始定義
三、子類重寫父類同名方法和屬性
子類和父類具有同名屬性和方法,默認使用子類的同名屬性和方法
class A(object): def __init__(self): self.str = 'A類的初始定義' def print_str(self): print(f'運用{self.str}') class B(object): def __init__(self): self.str = '子類B類的初始定義' def print_str(self): print(f'運用{self.str}') b = B() b.print_str() # 運用子類B類的初始定義
四、子類呼叫父類的同名方法和屬性
class A(object): def __init__(self): self.str = 'A類的初始定義' def print_str(self): print(f'運用{self.str}') class B(object): def __init__(self): self.str = 'B類的初始定義' def print_str(self): print(f'運用{self.str}') class C(A, B): def __init__(self): self.str = '子類C類的初始定義' def print_str(self): print(f'運用{self.str}') def print_self_str(self): self.__init__() self.print_str() # self即函式本身,這里前面呼叫了self引數,括號里就不用寫了 # self.print_str(self) 傳了兩遍引數會報錯 def print_A_str(self): A.__init__(self) A.print_str(self) def print_B_str(self): B.__init__(self) B.print_str(self) c = C() c.print_str() # 運用子類C類的初始定義 c.print_self_str() # 運用子類C類的初始定義 c.print_A_str() # 運用A類的初始定義 c.print_B_str() # 運用B類的初始定義 c.print_str() # 運用B類的初始定義 c.print_self_str() # 運用子類C類的初始定義 # 前后兩個print_str()輸出值不一樣,因為該函式沒有重新初始化self.str # __mro__查看繼承順序 print(C.__mro__) # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
五、多層繼承
eg:C類繼承B類,B類繼承A類,像這種三代及以上的叫多層繼承,規則同繼承
六、super呼叫父類方法
使用super()可以自動查找父類,呼叫順序遵循__mro__類屬性的順序,比較適合單繼承使用,
class A(object): def __init__(self): self.str='A類的初始定義' def print_str(self): print(f'運用{self.str}') class B(A): def __init__(self): self.str = 'B類的初始定義' def print_str(self): # 1、 super()帶引數 # super(B, self).__init__() # super(B, self).print_str() # 2、 super()無引數 super().__init__() super().print_str() class C(B): def __init__(self): self.str= 'C類的初始定義' def print_str(self): # 1、 super()帶引數 # super(C,self).__init__() # super(C,self).print_str() # 2、 super()無引數 super().__init__() super().print_str() c = C() c.print_str() # 運用A類的初始定義
七、私有權限
- 不能繼承給子類的屬性和方法需要添加私有權限
- 私有權限不能在外部直接輸出或使用
- 語法:私有屬性和方法區別在名字前面加兩個下劃線
class 類名(): #私有屬性 __屬性名 = 值 # 私有方法 def __函式名(self): 代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/162019.html
標籤:Python
上一篇:PEP 443 單分派泛型函式 -- Python官方檔案譯文 [原創]
下一篇:Python第一章-編碼規范
