繼承
一個類除了自身所擁有的屬性方法之外,還獲取了另外一個類的成員屬性和方法 是一種繼承關係
被繼承的類叫做父類(基類,超類),繼承的類叫做子類(衍生類)
在python中所有類都繼承object這個父類
繼承: (1) 單繼承 (2) 多繼承
單繼承
子父繼承之後,子類可以呼叫父類的公有成員
class Human(object):
eye = "黑色的"
def jump(self):
print("古代人類都能上樹")
def beat_animal(self):
print("古代人類都會打獵")
def __makefire(self):
print("古代人類會生火")
class Man(Human):
pass
obj = Man()
obj.jump()
子類無法繼承父類的私有方法
class Human(object):
eye = "黑色的"
def jump(self):
print("古代人類都能上樹")
def beat_animal(self):
print("古代人類都會打獵")
def __makefire(self):
print("古代人類會生火")
class Woman(Human):
def pub_func(self):
print(self) # <__main__.Woman object at 0x000001E555E49520>
# self.__makefire() # self
# (3) 子父繼承之後,子類可以重寫父類的同名公有方法
class Children(Human):
def beat_animal(self):
print("小孩天生只會打豆豆,不會打獵")
obj3 = Children()
obj3.beat_animal()
子父繼承之後,子類可以重寫父類的同名公有方法
class Human(object):
eye = "黑色的"
def jump(self):
print("古代人類都能上樹")
def beat_animal(self):
print("古代人類都會打獵")
def __makefire(self):
print("古代人類會生火")
class Children(Human):
def beat_animal(self):
print("小孩天生只會打豆豆,不會打獵")
obj3 = Children()
obj3.beat_animal()
多繼承
"""
多繼承尋找先繼承的父類
"""
class Father():
property = "風流倜儻,才華橫溢,玉樹臨風,才高八斗,學富五車,英姿灑窗"
def f_hobby(self):
print("吃喝嫖賭抽,坑蒙拐騙偷,抽菸喝酒燙頭")
class Mother():
property = "傾國傾城,貌美如花,沉魚落雁,閉月羞花,婀娜多姿,前凸後翹"
def m_hobby(self):
print("蹦野迪,社會搖,打麻將,網紅勾引小鮮肉")
class Daughter(Father,Mother):
pass
obj = Daughter()
print(obj.property) # out "風流倜儻,才華橫溢,玉樹臨風,才高八斗,學富五車,英姿灑窗"
obj.m_hobby()
解決跨越呼叫父類的方法 super
class Father():
property = "風流倜儻,才華橫溢,玉樹臨風,才高八斗,學富五車,英姿灑窗"
def f_hobby(): # 最好不這麼寫 會紅 但是能跑
print("吃喝嫖賭抽,坑蒙拐騙偷,抽菸喝酒燙頭")
class Mother():
property = "傾國傾城,貌美如花,沉魚落雁,閉月羞花,婀娜多姿,前凸後翹"
def m_hobby(self):
print("蹦野迪,社會搖,打麻將,網紅勾引小鮮肉")
class Son(Father, Mother):
property = "打遊戲,吃小零食"
def m_hobby(self):
print("son中m_hobby方法")
def skill1(self): # 用類呼叫成員
print(self) # <__main__.Son object at 0x000001B2F3AE4DF0>
Father.f_hobby()
print(Mother.property)
"""self按照順序找: 物件本身 => 類 => 父類 對應的成員 """
def skill2(self):
print(self.property) # 用物件呼叫成員
self.m_hobby() # 自動呼叫物件了
"""super()只呼叫父類的相關成員,順帶傳遞物件引數"""
def skill3(self):
print(super()) # <super: <class 'Son'>, <Son object>>
print(super().property) # 用super呼叫成員
super().m_hobby()
obj2 = Son()
obj2.skill1() # 透過類呼叫成員函式或方法
obj2.property = "喜歡看lol,dnf,wow,跑跑卡丁車,ddo,霸王大陸,澄海3c"
obj2.skill2() # """self按照順序找: 物件本身 => 類 => 父類 對應的成員 """
obj2.skill3() # 用super呼叫成員函式或方法
菱形繼承
"""
Human
Man Woman
Children
"""
class MyClass():
pass
class Human():
pty = 1
def feelT(self):
print("古代人類,天熱了,光腚1")
print(self.pty)
print("古代人類,天冷了,穿壽衣2")
class Man(Human):
# pty = 2
def feelT(self):
print("男人,天熱了,光膀子3")
print(super(),"<==2==>")
super().feelT()
print("男人,天冷了,光腚4")
class Woman(Human):
# pty = 3
def feelT(self):
print("女人,天熱了,脫毛5")
print(super(),"<==3==>")
super().feelT()
print("女人,天冷了,穿貂6")
class Children(Man,Woman):
# pty = 4
def feelT(self):
print("小孩,天熱了,光腚7")
print(super(),"<==1==>")
super().feelT()
print("小孩,天冷了,多喝熱水8")
# ### super的深層理解
obj = Children()
obj.feelT()
# 73512648
# self 一直都是 Chilren的 Obj 所以Pty會是 4 2 3 1 顯示
mro方法與super
mro: 方法解析順序 (c3演算法計算的)m :method
r :resolution
o :order
super 會自動根據mro列表返回出來的順序關係,依次呼叫
super作用:專門用於解決複雜的多繼承呼叫順序關係;依照mro返回的列表順序,依次呼叫;
super呼叫的順序:會按照c3演算法的廣度優先原則進行呼叫
super傳參:會預設在呼叫方法時,傳遞該物件引數;
"""
語法: 類.mro() => 列表
"""
lst = Children.mro()
print(lst)
"""
[
<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>
]
"""
issubclass與isinstance
issubclass
# issubclass 判斷類的子父關係(應用在類與類之間)
# return bool
"""只要在一條繼承鏈上滿足關係即可"""
res = issubclass(Children,Man)
res = issubclass(Children,Human)
res = issubclass(Children,MyClass)
# 如果元組當中有一個父類滿足,即返回真
res = issubclass(Children, (Man,Human,MyClass) )
print(res)
isinstance
# isinstance 判斷物件的型別 (應用在類與物件之間)
# return bool
"""只要在一條繼承鏈上滿足關係即可"""
res = isinstance(obj,Children)
res = isinstance(obj,Human)
res = isinstance(obj,MyClass)
# 如果元組當中有一個類滿足,即返回真
res = isinstance(obj, (Man,Human,MyClass) )
print(res)