1. 程式人生 > >Python:繼承·派生·覆蓋·super函式

Python:繼承·派生·覆蓋·super函式

繼承inheritnce和派生derived

什麼是繼承/派生
    派生就是從一個已有的類中衍生成新類
    繼承是指在衍生出的新類中的物件會擁有原類的屬性和行為
作用:
    用繼承派生機制,可以將一些共有功能加在基類中,實現程式碼共享
    在不改變基類程式碼的基礎上,改變原有類的功能
名詞:
    基類(base class)/超類(super class)父類(father class)
    派生類(derived class)/子類(child class)

單繼承:

語法:
    class 類名(基類名):
        語句塊
說明:
    單繼承是指派生類由一個基類衍生出來的類
class human:
	def say(self,what):
   	 	print('say',what)
	def walk(self,distance):
   		print('走了',distance,'公里')
class student(human):  #(human)後加的
	# def say(self,what):
	#     print('說',what)
	# def walk(self,distance):
	#     print('走了',distance,'公里')
	def study(self,subiect):
    	print('學習',subiect)
h1=human()
h1.say('天亮了')
h1.walk(5)
print('...............................')
s1=student()
s1.walk(4)
s1.say('感覺有點累')
s1.study('面向物件')
**繼承說明:**
Python3中任何類都直接或間接地繼承自object類
object類是一切類的超類
類的__base__屬性
__base__屬性用來記錄此類的基類

python內建類的繼承關係
>>>help(__butltins__)

覆蓋override

覆蓋是指在有繼承關係的類中,子類中實現了與基類同名的方法,在子類的實
例呼叫該方法時,實際呼叫的是子類的覆蓋版本,這種現象叫做覆蓋
作用:
實現和父類同名,但功能不同的方法
示例:
class A:
def work(self):
    print('A.work被呼叫')
class B(A):
	def work(self):
    	'''此方法會覆蓋父類中同名的方法'''
    	print('B.work被呼叫')
b=B()
b.work()
**問題:**
當覆蓋發生時,如何呼叫父類的被覆蓋方法
此例項示意顯示呼叫父類的顯式方法:
class A:                                   -\
	def work(self):                          \
    	print('A.work被呼叫')                  \
class B(A):                                     \   
    def work(self):                              \ 不推薦
		'''此方法會覆蓋父類中同名的方法'''         /  使用
    	print('B.work被呼叫')                   /
	pass                                      /
b=B()                                        /
#b.work()                                   /
A.work(b)                                 -/

super函式

super(cls,obj)返回繫結超類的例項(要求obj必須是cls類或者cls子類的物件)
super()返回繫結超類的例項,等同於:
super(__class__,例項方法的第一個引數),必須用在方法內呼叫
作用:
藉助super()返回的例項間接呼叫父類的覆蓋方法
示例:
class A:
	def work(self):
    	print('A.work被呼叫')
class B(A):
	def work(self):
    '''此方法會覆蓋父類中同名的方法'''
    	print('B.work被呼叫')
pass
b=B()
super(B,b).work()

super的應用
顯示呼叫基類的初始化方法
    當子類中實現了__init__方法,基類的__init__方法
    將不會被自動呼叫。如果需要呼叫,則需要用super顯式呼叫
class human:
	def __init__(self,n,a):
    	print('__init__被呼叫' ,n,a)
    	self.name=n
    	self.age=a
#顯式呼叫object類的__init__方法
    	super().__init__()
def infos(self):
    print('姓名',self.name)
    print('年齡',self.age)
class student(human):
	def __init__(self,n,a,s=0):
    	super().__init__(n,a)
    	self.score=s
	def infos(self):
    	super().infos()
    	print('成績',self.score)
h1=student('小李',18)
# h1=human('小張', 20)
h1.infos()