【python 11】super()
生活随笔
收集整理的這篇文章主要介紹了
【python 11】super()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、繼承
- 二、繼承的方式
- 三、多重繼承
一、繼承
python 中可以定義“類”來抽象出一類對象的特征和方法,所有的類都是從 “object”中繼承過來的
因為類中有很多方法是重復的,所以可以把很多類都具備的共同特征或屬性放到一個大類(基類)里邊,python 的子類可以從基類(父類)中繼承方法、屬性等來直接使用。
繼承以后,調用的時候其實都是跑到父類里邊去調用的,object 是所有類的父類
二、繼承的方式
繼承的時候可以分多種:
- 子類不需要定義 init:直接去父類找
- 子類需要定義 init,從父類中繼承 init
- 如果父類中缺少了子類需要的需求,或者某個需要不符合子類的要求,則可以重寫,就會覆蓋父類的。
如何調用父類的 init:
# super() 表示父類對象,往 init 里邊傳參數 super().__init__(參數) super(子類名, self).__init__(參數)1、如果需要從父類繼承 init,可以這樣寫:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef run(self):print(self.name + '正在跑步!') class Students(Person):def __init__(self, name, age):print('-----> student 的init')super().__init__(name, age) # 和 super(Students).__init__(name, age) 作用相同 s = Students('Jack',18) # 執行步驟,先調 __new__,產生新空間傳給 __init__,student什么都沒有,就會到其父類里邊找 s.run() >>> -----> student 的init Jack正在跑步! class Person:def __init__(self, name, age):self.name = nameself.age = agedef run(self):print(self.name + '正在跑步!') class Employee(Person):def eat(self):print(self.name + '正在吃飯!') e = Employee('xiaohong', '18') e.eat() >>> xiaohong正在吃飯!2、需要繼承父類的init,還需要添加自己新的 init:
class Person:def __init__(self, name, age):self.name = nameself.age = agedef run(self):print(self.name + '正在跑步!') class Students(Person):def __init__(self, name, age, sex):super().__init__(name, age)print('-----> student 的 init')print('sex:', sex) s = Students('Jack',18, 'male') s.run() >>> -----> student 的 init sex: male Jack正在跑步!3、重寫子類 init
子類如果重新定義了 init,且沒有進行 super() 繼承,則會覆蓋父類的 init
class Person:def __init__(self, name, age):self.name = nameself.age = agedef run(self):print(self.name + '正在跑步!') class Employee(Person):def __init__(self, sex):self.sex = sexprint('-----> employee 的 init')print('sex:', sex)e = Employee('female') e.run() >>> -----> employee 的 init sex: female AttributeError: 'Employee' object has no attribute 'name'三、多重繼承
父類中有相同的方法時,搜索順序:從左至右,深度優先
class Base:def test(self):print('-------Base---------') class A(Base):def test(self):print('AAAAAAAAAAAAAAAAAAAA') class B(Base):def test(self):print('BBBBBBBBBBBBBBBBBBBB') class C(Base):def test(self):print('CCCCCCCCCCCCCCCCCCCC') class D(A, B, C):pass d = D() d.test() import inspect print(inspect.getmro(D)) print(D.__mro__) # 獲取搜索順序方法二 >>> AAAAAAAAAAAAAAAAAAAA (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>)super 指的是 MRO 表中的下一個類,多繼承類是通過 MRO 的方式來保證各個父類的函數被逐一調用,而且保證每個父類函數只調用一次。
多重繼承的時候,如果不使用 super(),可能會導致某個類被多次初始化,所以會使用 super來避免這種情況:
未使用 super 的效果:
class A(object):def __init__(self):print ("init A Class")class B(A):def __init__(self):A.__init__(self)print("init B class")class C(A):def __init__(self):A.__init__(self)print("init C class")class D(B,C):def __init__(self):B.__init__(self)C.__init__(self)print ("init D class")class E(A):def __init__(self):A.__init__(self)print('init E class')class F(D,E):def __init__(self):D.__init__(self)D.__init__(self)print('init F class')F = F() >>> init A Class init B class init A Class init C class init D class init A Class init B class init A Class init C class init D class init F class使用 super 的效果:
class A(object):def __init__(self):print("init A class")class B(A):def __init__(self):print("init B class")super(B, self).__init__()class C(A):def __init__(self):print("init C class")super(C, self).__init__()class D(B,C):def __init__(self):print("init D class")super(D, self).__init__()class E(A):def __init__(self):print("init E class")super(E, self).__init__()class F(D,E):def __init__(self):print("init F class")super(F, self).__init__() F = F() >>> init F class init D class init B class init C class init E class init A class總結
以上是生活随笔為你收集整理的【python 11】super()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python 10】python 魔术
- 下一篇: A卡很难追 游戏开发者越来越喜欢DLSS