溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中什么是內置函數(shù)super()

發(fā)布時間:2020-08-26 16:51:48 來源:億速云 閱讀:266 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關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è)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI