本篇文章給大家分享的是有關Python中什么是內置函數(shù)super(),小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
面向對象編程之super內置函數(shù)的用法
先來看一段代碼:
定義一個名叫People的父類,又定義了一個叫Teacher的老師類和一個叫Student的學生類來繼承People的類,并根據(jù)這兩個子類實例化出兩個對象s1和t1。
class Date: def __init__(self,year,mon,day): self.year=year self.mon=mon self.day=day def birth_info(self): print("The birth is %s-%s-%s"%(self.year,self.mon,self.day)) class People: def __init__(self,name,age): self.name=name self.age=age def walk(self): print("%s is walking"%self.name) class Teacher(People): def __init__(self,name,age,year,mon,day,course): People.__init__(self,name,age) self.course=course self.birth=Date(year,mon,day) def teach(self): print("%s is teaching"%self.name) class Student(People): def __init__(self,name,age,year,mon,day,group): People.__init__(self,name,age) self.birth = Date(year, mon, day) self.group=group def study(self): print("%s is studying"%self.name) t1=Teacher("alex",28,1989,9,2,"python") s1=Student("jack",22,1995,2,8,"group2")
現(xiàn)在問題來了,假如因為需要,我要修改老師類和學生類的父類People的名字。
這樣一來,在老師類Teacher和學生類Student中繼承的類People也要修改,以及它們調用的init方法的那個父類也要修改名字,太麻煩了有沒有?這時候就可以使用super()這個內置函數(shù)來搞定了。
在python解釋器中查看幫助信息:
help(super)
得到如下信息:
Help on class super in module builtins: class super(object) | super() -> same as super(__class__, <first argument>) | super(type) -> unbound super object | super(type, obj) -> bound super object; requires isinstance(obj, type) | super(type, type2) -> bound super object; requires issubclass(type2, type)
super是一個內置函數(shù),加括號就得到一個對象,對象super()加"."可以直接調用父類的init方法。
這個對象在調用父類的init時,實際上就是在調用父類的綁定方法,所以就不需要在括號里加上self了。
修改后的代碼如下:
class Date: def __init__(self,year,mon,day): self.year=year self.mon=mon self.day=day def birth_info(self): print("The birth is %s-%s-%s"%(self.year,self.mon,self.day)) class People: def __init__(self,name,age): self.name=name self.age=age def walk(self): print("%s is walking"%self.name) class Teacher(People): def __init__(self,name,age,year,mon,day,course): super().__init__(name,age) self.course=course self.birth=Date(year,mon,day) def teach(self): print("%s is teaching"%self.name) class Student(People): def __init__(self,name,age,year,mon,day,group): super().__init__(name,age) self.birth = Date(year, mon, day) self.group=group def study(self): print("%s is studying"%self.name) t1=Teacher("alex",28,1989,9,2,"python") s1=Student("jack",22,1995,2,8,"group2")
這樣一來,父類的名字改變了,代碼里面繼承的父類的init方法的名字也不需要修改了。
python2中,也可以使用super,其調用方法為:super(Teacher,self)
使用super()函數(shù)時,python會在mro列表中繼續(xù)搜索下一個類。
只要每個重定義的方法統(tǒng)一使用super()并只調用它一次,那么控制流最終會遍歷完整個mro列表。每個方法只會調用一次。
使用super調用的所有的屬性,都是從mro列表當前的位置往后找,看mro列表的順序就可以看到子類的繼承關系。
查看上面代碼中Teacher這個子類的mro列表可以使用這個方法:
Teacher.mro()
使用super可以避免使用多重繼承時,子類繼承父類的順序問題。
子類繼承父類的數(shù)據(jù)屬性和函數(shù)屬性時,先執(zhí)行的先生效,當后面的代碼與前面的代碼有沖突時,
后面的代碼會把前面的代碼覆蓋掉,不使用super時需要自己解決繼承的順序問題,使用super就可以很好的解決這個問題了。
以上就是Python中什么是內置函數(shù)super(),小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。