繼承問題

江寒雨發表於2024-03-15

繼承

一個類除了自身所擁有的屬性方法之外,還獲取了另外一個類的成員屬性和方法 是一種繼承關係
被繼承的類叫做父類(基類,超類),繼承的類叫做子類(衍生類)
在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)


相關文章