多重繼承和多繼承, super, mro

2021-08-28 02:08:45 字數 4466 閱讀 9360

(父類派生子類,子類繼承父類)

通過繼承,可以讓子類去擁有父類中的屬性和方法,而不必重新編寫相同的**,並且可以在父類的基礎上新增新的屬性和功能。

在繼承的同時,子類還可以重寫父類中的方法,從而獲取與父類不同的功能,實現多型。

在 python 中 所有的類都是存在繼承關係的,沒有顯示繼承的,都是預設繼承 object 類

提高開發效率,避免**冗餘

#多重單繼承初始化問題

當在初始化時,子類只需要初始化自己擴充套件的屬性即可,父類中的屬**給父類去初始化。

class person(object):

def __init__(self, name):

self.__name = name

print("person init")

def get_name(self):

return self.__name

class monther(person):

def __init__(self, name, job):

person.__init__(self, name)

self.__job = job

print("monther init")

def get_job(self):

return self.__job

class parent(person):

def __init__(self, name, age):

person.__init__(self, name)

self.__age = age

print("parent init")

def get_age(self):

return self.__age

class son(parent, monther):

def __init__(self, name, age, job, gender):

parent.__init__(self, name, age)

monther.__init__(self, name, job)

self.__gender = gender

print("son init")

def get_gender(self):

return self.__gender

wo = son('tom', 22, 'teacher', 'male')

print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>person init

parent init

person init

monther init

son init

tom 22 teacher male

很明顯這是不對的,因為 father 類和 mother 類都是繼承於 person 類的,在自己的初始化方法中,執行了父類的初始化方法,所以執行了兩次,造成了**冗餘

多重多繼承 =》 person被呼叫多次 ==> object更多次

super函式解決繼承中父類被重複初始化問題

super(currentclassname, self).init(*args, **kwargs)

class person(object):

def __init__(self, name):

self.__name = name

print("person init")

def get_name(self):

return self.__name

class mother(person):

def __init__(self, job, *args):

super(mother, self).__init__(*args)

self.__job = job

print("mother init")

def get_job(self):

return self.__job

class father(person):

def __init__(self, age, *args):

super(father, self).__init__(*args)

self.__age = age

print("father init")

def get_age(self):

return self.__age

class son(father, mother):

def __init__(self, name, age, job, gender):

super(son, self).__init__(name, age, job)

self.__gender = gender

print("son init")

def get_gender(self):

return self.__gender

wo = son('tom', 22, 'teacher', 'male')

print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>person init

mother init

father init

son init

teacher tom 22 male

通過執行結果來看,使用 super 改進後的**只初始化了一次 person 的初始化方法。

###鑽石繼承

mro method resolution order 方法解析順序

在類出現繼承時,每個類中都會儲存乙個當前類的繼承關係的表。

super 函式在執行時,會在自己儲存的這個繼承關係中去查詢第乙個引數,也就是當前的類名的下乙個類是誰。然後去呼叫下個類的初始化方法。

python 中使用廣度優先演算法來決定繼承關係的排序

在初始化父類時,也可以使用 super().init() 函式來呼叫,簡化super函式的寫法。

這時,super函式中沒有引數,還是能正確執行,就是依照mro中的順序來執行的。

super().__init__(*args)
物件在呼叫方法時,也會依照這個順序來查詢方法。類在繼承時,繼承關係的書寫順序會影響mro中的順序。

多繼承與多重繼承

什莫是多繼承?乙個類擁有兩個或者兩個以上的父類 什莫是多重繼承?乙個類不僅僅有父類還有祖父類 什莫是虛繼承?虛繼承是為了解決多繼承的問題 經過這樣的宣告後,當基類通過多條派生路徑被乙個派生類繼承時,該派生類只繼承該基類一次,也就是說,基類成員只保留一次。菱形繼承 以往,在派生類的建構函式中只需負責對...

C 多繼承 多重繼承

派生類都只有乙個基類,稱為單繼承。除此之外,c 也支援多繼承,即乙個派生類可以有兩個或多個基類。多繼承的語法也很簡單,將多個基類用逗號隔開。例如已宣告了類a 類b和類c,那麼可以這樣來宣告派生類d class d public a,private b,protected c d 是多繼承形式的派生類...

C 繼承5 多重繼承 多繼承

多重繼承 1.person類,資料成員 m strname 成員函式 構造 析構 pay 2.soldier類,資料成員 m iage 成員函式 構造 析構 work 3.infantry類,資料成員 無 成員函式 構造 析構 attack 4.定義函式test1 person p test2 pe...