亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Python中的super()面向對象編程

Python中的super()面向對象編程

熱門標簽:企業微信地圖標注 怎么辦理400客服電話 B52系統電梯外呼顯示E7 銀川電話機器人電話 沈陽防封電銷電話卡 鶴壁手機自動外呼系統違法嗎 高德地圖標注收入咋樣 地圖標注多個 萊蕪電信外呼系統

Python super()面向對象編程

一、為什么要用 super()

當子類重寫了父類方法時,又想調用父類的同名方法時,就需要用到 super()

二、什么是 super

  • 在 Python 中,super 是一個特殊的類
  • super() 就是使用 super 類創建出來的對象
  • 實際應用的場景:子類在重寫父類方法時,調用父類方法

三、繼承中使用 super

1、實例方法使用 super

類圖

實際代碼

class A:
    def __init__(self):
        self.n = 1

    def add(self, m):
        print(f'AAA [self] is {id(self)}')
        print(f'AAA [self.n] is {self.n}')
        self.n += m


class B(A):
    def __init__(self):
        self.n = 100

    # 重寫父類方法
    def add(self, m):
        # 子類特有代碼
        print(f'BBB [self] is {id(self)}')
        print(f'BBB [self.n] is {self.n}')

        # 調用父類方法
        super().add(m)

        self.n += m


b = B()
b.add(2)
print(b.n)

 

# 輸出結果
BBB [self] is 4489158560
BBB [self.n] is 100

AAA [self] is 4489158560
AAA [self.n] is 100

104

super().add()  的確調用了父類方法
重點:此時父類方法的 self 并不是父類實例對象,而是子類實例對象

2、構造方法使用 super

class Animal:
    def __init__(self, name):
        self.name = name

    def prints(self):
        print("Animale name is ", self.name)


class Dog(Animal):
    def __init__(self, name, age):
        # 調用父類的 init 構造方法
        super(Dog, self).__init__(name)
        self.age = age

    def prints(self):
        # 調用父類的方法
        super(Dog, self).prints()
        print("Dog age is ", self.age)


dog = Dog("小汪", 10)
dog.prints()

 

# 輸出結果
Animale name is  小汪
Dog age is  10

這里用了 super(子類名, self) ,和上面的 super() 是一樣效果

調用父類方法有兩種方式

  • super().父類方法() 
  • super(子類名, self).父類方法() 

其實還有第三種

在 Python  2.x 的時候,如果需要調用父類的方法,還可以用

父類名.方法(self)

  • 這種方式,Python 3.x 還是支持的
  • 過不不推薦,因為父類名發生變化的話,方法調用位置的類名也要同步修改

通過父類名調用父類方法(不推薦)

class Animal:
    def __init__(self, name):
        self.name = name

    def prints(self):
        print("Animale name is ", self.name)


class Dog(Animal):
    def __init__(self, name, age):
        # 調用父類的 init 構造方法
        Animal.__init__(self, name)
        self.age = age

    def prints(self):
        # 調用父類的方法
        Animal.prints(self)
        print("Dog age is ", self.age)


dog = Dog("小汪", 10)
dog.prints()


# 輸出結果
Animale name is  小汪
Dog age is  10

通過父類名調用的這種方式,是需要傳 self 參數的哦

溫馨提示:
在開發時, 父類名.方法() , super().方法() 兩種方式不要混用哈

靈魂拷問一:既然已經重寫了子類的構造方法,為什么還要去調用 super?
子類需要重寫父類方法來實現子類獨有的功能,但同時又需要依賴父類方法來完成某些邏輯

實際栗子

  • 在實現多線程的時候(后面會詳細展開說多線程)
  • 父類 Thread 的構造方法包含了很多邏輯代碼
  • 子線程雖然需要實現子類獨有功能,但仍需父類方法來處理其他邏輯

from threading import Thread


class MyThread(Thread):
    def __init__(self, name):
        # 1、實現子類獨有功能
        print("子類線程 %s" % name)
        # 2、需要依賴父類方法完成其他功能
        super().__init__(name=name)

四、多繼承中使用 super

類圖

實際代碼

# 多繼承
class Animal:
    def __init__(self, animalName):
        print(animalName, 'is an animal.')


# Mammal 繼承 Animal
class Mammal(Animal):
    def __init__(self, mammalName):
        print(mammalName, 'is a mammal.')
        super().__init__(mammalName)


# CannotFly 繼承 Mammal
class CannotFly(Mammal):
    def __init__(self, mammalThatCantFly):
        print(mammalThatCantFly, "cannot fly.")
        super().__init__(mammalThatCantFly)


# CannotSwim 繼承 Mammal
class CannotSwim(Mammal):
    def __init__(self, mammalThatCantSwim):
        print(mammalThatCantSwim, "cannot swim.")
        super().__init__(mammalThatCantSwim)


# Cat 繼承 CannotSwim 和 CannotFly
class Cat(CannotSwim, CannotFly):
    def __init__(self):
        print('I am a cat.');
        super().__init__('Cat')


# Driver code
cat = Cat()
print('')
bat = CannotSwim('Bat')

 

# 輸出結果
I am a cat.
Cat cannot swim.
Cat cannot fly.
Cat is a mammal.
Cat is an animal.

Bat cannot swim.
Bat is a mammal.
Bat is an animal.

好像挺奇怪的,從輸出結果看,為什么 CannotSwim 類里面的 super().__init__() 調用的是 CannotFly 類里面的方法呢?不是應該調用 CannotSwim 的父類 Mamal 的方法嗎?

靈魂拷問二:super 的執行順序到底是什么?

  • 其實 super() 并不一定調用父類的方法
  • super() 是根據類的 MRO 方法搜索順序來決定調用誰的
  • super() 真正調用的是 MRO 中的下一個類,而不一定是父類
  • 當然,這種情況只會出現在多繼承

先來看看 Cat 的 MRO

print(Cat.__mro__)

(class '__main__.Cat'>, class '__main__.CannotSwim'>, class '__main__.CannotFly'>, class '__main__.Mammal'>, class '__main__.Animal'>, class 'object'>)

從 Cat 的 MRO 可以看到

  • CannotSwim 后面跟的是 CannotFly 而不是 Mamal
  • 所以 CannotSwim 類里面的 super() 會調用 CannotFly 里面的方法

多繼承的栗子二

實際代碼

class A:
    def __init__(self):
        self.n = 2

    def add(self, m):
        # 第四步
        # 來自 D.add 中的 super
        # self == d, self.n == d.n == 5
        print('self is {0} @AAA.add'.format(self))
        self.n += m
        # d.n == 7


class C(A):
    def __init__(self):
        self.n = 4

    def add(self, m):
        # 第三步
        # 來自 B.add 中的 super
        # self == d, self.n == d.n == 5
        print('self is {0} @CCC.add'.format(self))
        # 等價于 suepr(C, self).add(m)
        # self 的 MRO 是 [D, B, C, A, object]
        # 從 C 之后的 [A, object] 中查找 add 方法
        super().add(m)

        # 第五步
        # d.n = 7
        self.n += 4
        # d.n = 11


class B(A):
    def __init__(self):
        self.n = 3

    def add(self, m):
        # 第二步
        # 來自 D.add 中的 super
        # self == d, self.n == d.n == 5
        print('self is {0} @BBB.add'.format(self))
        # self 的 MRO 是 [D, B, C, A, object]
        # 從 B 之后的 [C, A, object] 中查找 add 方法
        # 從 C 找 add 方法
        super().add(m)

        # 第六步
        # d.n = 11
        self.n += 3
        # d.n = 14


class D(B, C):
    def __init__(self):
        self.n = 5

    def add(self, m):
        # 第一步
        print('self is {0} @DDD.add'.format(self))
        # self 的 MRO 是 [D, B, C, A, object]
        # 從 D 之后的 [B, C, A, object] 中查找 add 方法
        # 從 B 找 add 方法
        super().add(m)

        # 第七步
        # d.n = 14
        self.n += 5
        # self.n = 19


d = D()
d.add(2)
print(d.n)
 

先看看 D 類的 MRO

print(D.__mro__)

(class '__main__.D'>, class '__main__.B'>, class '__main__.C'>, class '__main__.A'>, class 'object'>)

輸出結果

self is __main__.D object at 0x10c14a190> @DDD.add
self is __main__.D object at 0x10c14a190> @BBB.add
self is __main__.D object at 0x10c14a190> @CCC.add
self is __main__.D object at 0x10c14a190> @AAA.add
19

調用順序的確是 D、B、C、A

執行順序

class D(B, C):          class B(A):            class C(A):             class A:
def add(self, m):       def add(self, m):      def add(self, m):       def add(self, m):
super().add(m)  1.--->  super().add(m) 2.--->  super().add(m)  3.--->  self.n += m
 self.n += 5   ------6. self.n += 3    ----5. self.n += 4     ----4. --|
(14+5=19)               (11+3=14)              (7+4=11)                (5+2=7)
 

執行順序圖


到此這篇關于Python super()面向對象編程的文章就介紹到這了,更多相關Python super()內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python中super()函數的理解與基本使用
  • 詳解python的super()的作用和原理
  • Python類的繼承super相關原理解析
  • python super()函數的基本使用
  • Python類super()及私有屬性原理解析
  • Python super()函數使用及多重繼承
  • Python super()方法原理詳解
  • python super函數使用方法詳解
  • python super用法及原理詳解
  • python類中super() 的使用解析
  • 使用 Supervisor 監控 Python3 進程方式
  • Python高級編程之繼承問題詳解(super與mro)
  • Python 繼承,重寫,super()調用父類方法操作示例
  • python3中類的繼承以及self和super的區別詳解

標簽:烏魯木齊 呼倫貝爾 葫蘆島 安慶 呼倫貝爾 湘西 銀川 三亞

巨人網絡通訊聲明:本文標題《Python中的super()面向對象編程》,本文關鍵詞  Python,中的,super,面向,對象,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python中的super()面向對象編程》相關的同類信息!
  • 本頁收集關于Python中的super()面向對象編程的相關信息資訊供網民參考!
  • 推薦文章
    久草免费在线色站| 日韩专区亚洲综合久久| 四虎影视库| 在线观看成人网 | 尤物视频网站在线观看| 国产不卡高清在线观看视频| 成人免费网站视频ww| 国产激情一区二区三区| 国产麻豆精品免费密入口| 一 级 黄 中国色 片| 天天色色色| 国产成人欧美一区二区三区的| 精品美女| 国产网站麻豆精品视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 可以免费看污视频的网站| 国产成a人片在线观看视频| 成人a大片在线观看| 青青久久国产成人免费网站| 精品视频免费看| 久久福利影视| 国产麻豆精品免费密入口| 黄色免费网站在线| 欧美激情一区二区三区在线| 国产网站免费视频| 国产一区二区精品在线观看| 欧美a级片免费看| 美女被草网站| 国产精品自拍亚洲| 国产视频一区二区在线观看| 黄色福利| 精品国产一区二区三区免费| 青青青草影院 | 国产伦理精品| 99色视频| 欧美激情伊人| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 成人免费一级毛片在线播放视频| 精品视频在线看| 久久99中文字幕久久| 国产91视频网| 成人影视在线播放| 欧美激情一区二区三区视频| 色综合久久天天综合绕观看| 午夜精品国产自在现线拍| 黄色短视频网站| 亚洲女初尝黑人巨高清在线观看| 日韩中文字幕在线亚洲一区| 你懂的福利视频| 日韩欧美一二三区| 精品国产一区二区三区精东影业 | 九九免费高清在线观看视频| 在线观看成人网 | 色综合久久天天综合观看| 国产极品精频在线观看| 二级特黄绝大片免费视频大片| 免费一级片在线观看| 亚久久伊人精品青青草原2020| 欧美一级视频免费观看| 免费国产在线观看不卡| 欧美激情一区二区三区在线 | 免费国产在线观看| 亚洲精品久久久中文字| 国产麻豆精品免费视频| 欧美一区二区三区在线观看| 国产精品免费久久| 欧美一级视频高清片| 在线观看成人网 | 日韩在线观看视频网站| 日本免费乱理伦片在线观看2018| 999精品在线| 欧美激情中文字幕一区二区| 国产91精品系列在线观看| 国产精品自拍亚洲| 日本伦理片网站| 欧美激情一区二区三区在线 | 欧美日本二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人啪精品| 亚洲天堂一区二区三区四区| 高清一级淫片a级中文字幕| 天天做人人爱夜夜爽2020 | 中文字幕Aⅴ资源网| 91麻豆精品国产自产在线| 你懂的在线观看视频| 九九精品久久| 午夜激情视频在线观看| 成人免费观看视频| 99久久网站| 国产网站麻豆精品视频| 可以在线看黄的网站| 91麻豆精品国产高清在线| 精品在线观看国产| 久久99中文字幕久久| 国产精品自拍在线观看| 精品久久久久久综合网| 日韩一级黄色| 国产伦久视频免费观看 视频| 青青青草影院| 国产成人精品综合在线| 一级片片| 日韩av成人| 国产伦久视频免费观看 视频| 99久久精品国产高清一区二区| 精品视频在线观看一区二区三区| 免费国产在线视频| 精品在线观看一区| 欧美日本二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 午夜在线影院| 欧美大片aaaa一级毛片| 精品国产三级a∨在线观看| 国产91丝袜在线播放0| 日本在线不卡视频| 午夜激情视频在线观看| 黄色免费网站在线| 免费一级生活片| 九九久久99| 国产网站免费视频| 国产a视频精品免费观看| 久久久久久久久综合影视网| 国产一级生活片| 色综合久久天天综线观看| 国产视频一区二区三区四区 | 亚州视频一区二区| 欧美大片一区| 色综合久久久久综合体桃花网| 日日日夜夜操| 四虎影视库国产精品一区| 午夜在线亚洲| 日韩专区第一页| 99热精品一区| 欧美激情中文字幕一区二区| 天天做日日干| 中文字幕一区二区三区 精品 | 99久久网站| 色综合久久天天综合观看| 精品国产一区二区三区久久久蜜臀| 国产网站免费| 成人影院一区二区三区| 免费一级片在线| 亚洲 男人 天堂| 久久国产精品自由自在| 尤物视频网站在线| 国产综合成人观看在线| 国产网站麻豆精品视频| 成人a大片高清在线观看| 国产极品精频在线观看| 韩国三级香港三级日本三级la| 欧美激情一区二区三区视频| 日韩免费片| 成人免费观看网欧美片| 天堂网中文字幕| 精品视频在线观看视频免费视频| 国产美女在线一区二区三区| 香蕉视频一级| 国产精品123| 精品毛片视频| 天天做日日爱夜夜爽| 日本免费乱理伦片在线观看2018| 四虎影视库国产精品一区| 亚洲精品中文一区不卡| 日日夜夜婷婷| 精品国产亚一区二区三区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产精品自拍在线| 国产不卡高清在线观看视频| 99久久精品国产高清一区二区| 久久精品成人一区二区三区| 可以免费看毛片的网站| 久草免费在线色站| 日韩中文字幕在线播放| 精品视频在线观看免费| 日日夜人人澡人人澡人人看免| 日韩一级黄色片| 欧美一级视频免费观看| 日韩综合| 欧美激情一区二区三区视频 | 欧美激情一区二区三区在线 | 天天做人人爱夜夜爽2020 | 日本伦理片网站| 韩国妈妈的朋友在线播放| 国产91精品一区二区| 精品视频在线观看一区二区三区| 精品国产亚一区二区三区| 欧美激情一区二区三区在线 | 日本特黄特色aaa大片免费| 国产精品自拍在线观看| 精品毛片视频| 国产视频一区二区在线观看| 91麻豆爱豆果冻天美星空| 一级毛片看真人在线视频| 色综合久久天天综合| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人影视在线播放| 一级毛片视频播放| 亚洲精品影院| 99热精品在线| 日本乱中文字幕系列 |