日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【python 11】super()

發布時間:2023/12/15 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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()的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。