對(duì)Python3之方法的覆蓋與super函數(shù)詳解
#覆蓋
覆蓋:在繼承關(guān)系中,子類(lèi)實(shí)現(xiàn)了與基類(lèi)同名的方法,在子類(lèi)的實(shí)例調(diào)用該方法時(shí),實(shí)例調(diào)用的是子類(lèi)的覆蓋版本。
通俗的講,就是小明繼承了他⑧的自行車(chē),經(jīng)過(guò)自己的改裝,成了電動(dòng)車(chē),那么小明每次騎的就是電動(dòng)車(chē)了(這個(gè)電動(dòng)車(chē)是可以腳蹬的,后邊栗子會(huì)繼續(xù)使用)
舉個(gè)簡(jiǎn)單的栗子:
class Bicycle():
def run(self):
print('我是自行車(chē)的run方法')
class E_Bicycle(Bicycle): # 繼承自行車(chē)
def run(self):
print('我是電動(dòng)車(chē)的run方法')
b = Bicycle()
b.run()
e_b = E_Bicycle()
e_b.run()
打印結(jié)果:
我是自行車(chē)的run方法 我是電動(dòng)車(chē)的run方法
注意:方法的覆蓋必須要同名,例如這個(gè)栗子是繼承與派生關(guān)系,方法還同名,只是print被改變了
這個(gè)栗子不是特別明顯,改動(dòng)一點(diǎn)點(diǎn):
class Bicycle(object):
def __init__(self, name):
self.name = name
def run(self):
print('我是%s的run方法'%self.name)
class E_Bicycle(Bicycle): # 繼承自行車(chē)
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
print('我是%s的run方法, 被主人改裝%s年了'%(self.name, self.age))
b = Bicycle('自行車(chē)')
b.run()
e_b = E_Bicycle('電動(dòng)車(chē)', 3)
e_b.run()
改變了name值,并且加入了age參數(shù)。
那么如何調(diào)用父類(lèi)的方法呢或?qū)傩阅兀?/strong>
#super
super(cls, obj)返回綁定超類(lèi)的實(shí)例(要去obj必須是cls類(lèi)型的實(shí)例)
super的作用:間接調(diào)用父類(lèi)覆蓋方法
舉個(gè)栗子:
# 示意super函數(shù)間接調(diào)用父類(lèi)中被覆蓋的方法
class A:
def work(self):
print('A.work被調(diào)用')
class B(A):
'''B類(lèi)繼承A類(lèi)'''
def work(self):
print('B.work被調(diào)用')
def super_work(self):
'''調(diào)用B類(lèi)自己的work方法'''
self.work() # B.work被調(diào)用,調(diào)用自身類(lèi)的方法,和調(diào)用屬性一樣
super(B, self).work() # A.work被調(diào)用, 借助super調(diào)用父類(lèi)被覆蓋的方法
super().work() # A.work被調(diào)用 這種必須在方法內(nèi)使用 ,可以省略(自身類(lèi))參數(shù)
b = B()
# b.work() # B.work被調(diào)用,調(diào)自身的類(lèi)
# super(B, b).work() # A.work被調(diào)用(使用super是調(diào)用B的父類(lèi))
# super().work() # RuntimeError: super(): no arguments 不知道調(diào)用誰(shuí),所以此種省略參數(shù)的只能在內(nèi)部使用
b.super_work() # 以上懂了,這回也就懂了
顯示調(diào)用基類(lèi)的初始化方法:
當(dāng)子類(lèi)中實(shí)現(xiàn)了__init__(雙下劃線的init方法,貌似不顯示)方法,基類(lèi)的構(gòu)造方法并不會(huì)被調(diào)用,此時(shí)需要顯示調(diào)用
舉個(gè)栗子:
# 示意顯示調(diào)用初始化方法
class Human:
def __init__(self, n, a):
self.name = n
self.age = a
print('Human初始化的方法被調(diào)用了')
def infos(self):
print('姓名', self.name)
print('年齡', self.age)
class Student(Human):
def __init__(self, n, a, s=0):
# super(Student, self).__init__(n, a) # 調(diào)用父類(lèi)的初始化方法 復(fù)習(xí)上邊講的
super().__init__(n, a) # 調(diào)用父類(lèi)的初始化方法 內(nèi)部省略參數(shù)
self.score = s # 增加一個(gè)屬性
print('Student的初始化方法被調(diào)用了')
def infos(self): # 方法的重寫(xiě)
super().infos() # 顯示調(diào)用父類(lèi)的方法
print('成績(jī)是:', self.score)
s1 = Student('張三', 20, 80)
s1.infos()
打印結(jié)果:
Human初始化的方法被調(diào)用了 Student的初始化方法被調(diào)用了 姓名 張三 年齡 20 成績(jī)是: 80

改寫(xiě)上述的自行車(chē)與電動(dòng)車(chē)的栗子:
class Bicycle(object):
def __init__(self, name):
self.name = name
def run(self):
print('我是%s的run方法'%self.name)
class E_Bicycle(Bicycle): # 繼承自行車(chē)
def __init__(self, name, age):
super().__init__(name) # 調(diào)用父類(lèi)的name屬性
self.age = age
def run(self):
super().run() # 調(diào)用父類(lèi)的run方法
print('被主人改裝%s年了'%(self.age)
b = Bicycle()
b.run()
e_b = E_Bicycle('電動(dòng)車(chē)', 3)
e_b.run()

本節(jié)就到這吧
以上這篇對(duì)Python3之方法的覆蓋與super函數(shù)詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例
今天小編就為大家分享一篇python 編寫(xiě)簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python中eval()函數(shù)的詳細(xì)使用教程
eval函數(shù)在Python中具有非常重要的地位,熟練的使用eval函數(shù)能夠?yàn)槲覀兊腜ython編程提供很多的便利之處,下面這篇文章主要給大家介紹了關(guān)于Python中eval()函數(shù)的詳細(xì)使用,需要的朋友可以參考下2022-07-07
Python使用MYSQLDB實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中導(dǎo)出XML文件的方法
這篇文章主要介紹了Python使用MYSQLDB實(shí)現(xiàn)從數(shù)據(jù)庫(kù)中導(dǎo)出XML文件的方法,涉及Python使用MYSQLDB操作數(shù)據(jù)庫(kù)及XML文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05
Python使用atexit模塊實(shí)現(xiàn)Golang的defer功能
這篇文章主要為大家詳細(xì)介紹了Python如何使用atexit模塊實(shí)現(xiàn)Golang的defer功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
Python必備基礎(chǔ)之閉包和裝飾器知識(shí)總結(jié)
都2021年了Python的閉包和裝飾器難道你還不會(huì)?今天就帶大家詳細(xì)總結(jié)一下Python閉包和裝飾器的相關(guān)知識(shí),需要的朋友可以參考下2021-06-06
python實(shí)現(xiàn)微秒級(jí)等待問(wèn)題(windows)
這篇文章主要介紹了python實(shí)現(xiàn)微秒級(jí)等待問(wèn)題(windows),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

