物件導向程式設計之super內建函式的用法

2021-09-20 00:20:03 字數 3619 閱讀 8083

先來看一段**:

定義乙個名叫people的父類,又定義了乙個叫teacher的老師類和乙個叫student的學生類

來繼承people的類,並根據這兩個子類例項化出兩個物件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")

現在問題來了,假如因為需要,我要修改老師類和學生類的父類people的名字。

這樣一來,在老師類teacher和學生類student中繼承的類people也要修改,以及它們

呼叫的init方法的那個父類也要修改名字,太麻煩了有沒有?

這時候就可以使用super()這個內建函式來搞定了。

在python直譯器中檢視幫助資訊:

help(super)
得到如下資訊:

help on class super in module builtins:

class super(object)

| super() -> same as super(__class__, )

| 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是乙個內建函式,加括號就得到乙個物件,物件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()並只呼叫它一次,那麼控制流最終會遍歷完整個mro列表。每個方法只會呼叫一次。

使用super呼叫的所有的屬性,都是從mro列表當前的位置往後找,看mro列表的順序就可以看到子類的繼承關係

檢視上面**中teacher這個子類的mro列表可以使用這個方法:

teacher.mro()
使用super可以避免使用多重繼承時,子類繼承父類的順序問題。

子類繼承父類的資料屬性和函式屬性時,先執行的先生效,當後面的**與前面的**有衝突時,

後面的**會把前面的**覆蓋掉,不使用super時需要自己解決繼承的順序問題,使用super就可以很好的解決這個問題了。

物件導向程式設計 super高階(十)

一 入門使用 在python中,使用super最常見的讓子類繼承父類。在這種情況下,當前類和物件可以作為super函式的引數使用,呼叫函式返回的任何方法都是呼叫超類的方法,而不是當前類的方法。class information object def init self,name,age self.n...

物件導向程式設計之術語

術語 含義屬性 一小段資訊,例如顏色 高度或重量,描述物件的乙個特性 字段物件內部的指定值 操作屬於物件的一段 方法操作的同義詞 訊息從乙個物件傳送到另乙個物件的請求 呼叫執行操作,以響應訊息 執行呼叫的同義詞 關聯兩個物件之間的直接或間接連線 聚合強關聯,隱含著某種部分 一體層次結構 復合強聚合,...

物件導向 this和super

目錄 this的原理 super的兩個用法 關於this和super的總結 this跟super呼叫 哪個物件呼叫了this所在函式 包含this的函式,this一般都在方法內部呼叫 那麼this就代表哪個物件 這時候在壓棧的函式中this會把物件引用所對用的位址值拿過來,跟物件引用名指向堆記憶體中...