欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中的super()面向?qū)ο缶幊?/h1>
 更新時(shí)間:2021年09月06日 09:16:59   作者:小菠蘿測(cè)試筆記  
這篇文章主要介紹了Python的面向?qū)ο缶幊?super,super在Pyhon是一個(gè)特殊的的類,想具體了解的朋友請(qǐng)參考下面文章內(nèi)容

Python super()面向?qū)ο缶幊?br />

一、為什么要用 super()

當(dāng)子類重寫了父類方法時(shí),又想調(diào)用父類的同名方法時(shí),就需要用到 super()

二、什么是 super

  • 在 Python 中,super 是一個(gè)特殊的類
  • super() 就是使用 super 類創(chuàng)建出來(lái)的對(duì)象
  • 實(shí)際應(yīng)用的場(chǎng)景:子類在重寫父類方法時(shí),調(diào)用父類方法

三、繼承中使用 super

1、實(shí)例方法使用 super

類圖

實(shí)際代碼

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}')

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

        self.n += m


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

 

# 輸出結(jié)果
BBB [self] is 4489158560
BBB [self.n] is 100

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

104

super().add()  的確調(diào)用了父類方法
重點(diǎn):此時(shí)父類方法的 self 并不是父類實(shí)例對(duì)象,而是子類實(shí)例對(duì)象

2、構(gòu)造方法使用 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):
        # 調(diào)用父類的 init 構(gòu)造方法
        super(Dog, self).__init__(name)
        self.age = age

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


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

 

# 輸出結(jié)果
Animale name is  小汪
Dog age is  10

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

調(diào)用父類方法有兩種方式

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

其實(shí)還有第三種

在 Python  2.x 的時(shí)候,如果需要調(diào)用父類的方法,還可以用

父類名.方法(self)

  • 這種方式,Python 3.x 還是支持的
  • 過(guò)不不推薦,因?yàn)楦割惷l(fā)生變化的話,方法調(diào)用位置的類名也要同步修改

通過(guò)父類名調(diào)用父類方法(不推薦)

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):
        # 調(diào)用父類的 init 構(gòu)造方法
        Animal.__init__(self, name)
        self.age = age

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


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


# 輸出結(jié)果
Animale name is  小汪
Dog age is  10

通過(guò)父類名調(diào)用的這種方式,是需要傳 self 參數(shù)的哦

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

靈魂拷問(wèn)一:既然已經(jīng)重寫了子類的構(gòu)造方法,為什么還要去調(diào)用 super?
子類需要重寫父類方法來(lái)實(shí)現(xiàn)子類獨(dú)有的功能,但同時(shí)又需要依賴父類方法來(lái)完成某些邏輯

實(shí)際栗子

  • 在實(shí)現(xiàn)多線程的時(shí)候(后面會(huì)詳細(xì)展開說(shuō)多線程)
  • 父類 Thread 的構(gòu)造方法包含了很多邏輯代碼
  • 子線程雖然需要實(shí)現(xiàn)子類獨(dú)有功能,但仍需父類方法來(lái)處理其他邏輯

from threading import Thread


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

四、多繼承中使用 super

類圖

實(shí)際代碼

# 多繼承
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')

 

# 輸出結(jié)果
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.

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

靈魂拷問(wèn)二:super 的執(zhí)行順序到底是什么?

  • 其實(shí) super() 并不一定調(diào)用父類的方法
  • super() 是根據(jù)類的 MRO 方法搜索順序來(lái)決定調(diào)用誰(shuí)的
  • super() 真正調(diào)用的是 MRO 中的下一個(gè)類,而不一定是父類
  • 當(dāng)然,這種情況只會(huì)出現(xiàn)在多繼承

先來(lái)看看 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() 會(huì)調(diào)用 CannotFly 里面的方法

多繼承的栗子二

實(shí)際代碼

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

    def add(self, m):
        # 第四步
        # 來(lái)自 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):
        # 第三步
        # 來(lái)自 B.add 中的 super
        # self == d, self.n == d.n == 5
        print('self is {0} @CCC.add'.format(self))
        # 等價(jià)于 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):
        # 第二步
        # 來(lái)自 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'>)

輸出結(jié)果

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

調(diào)用順序的確是 D、B、C、A

執(zhí)行順序

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)
 

執(zhí)行順序圖


到此這篇關(guān)于Python super()面向?qū)ο缶幊痰奈恼戮徒榻B到這了,更多相關(guān)Python super()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Matlab將矩陣保存到csv和txt文件

    使用Matlab將矩陣保存到csv和txt文件

    這篇文章主要介紹了使用Matlab將矩陣保存到csv和txt文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • OpenCV圖像處理之自定義濾波

    OpenCV圖像處理之自定義濾波

    濾波處理分為兩大類:線性濾波和非線性濾波,OpenCV里有這些濾波的函數(shù),使用起來(lái)非常方便,這篇文章主要給大家介紹了關(guān)于OpenCV圖像處理之自定義濾波的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解

    Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解

    在復(fù)雜的Excel業(yè)務(wù)數(shù)據(jù)處理中,三兄弟扮演的角色缺一不可。如何能夠使用xlrd/xlwt/xlutils三個(gè)模塊來(lái)實(shí)現(xiàn)數(shù)據(jù)處理就是今天的內(nèi)容,希望對(duì)大家有所幫助
    2023-03-03
  • python中的List sort()與torch.sort()

    python中的List sort()與torch.sort()

    這篇文章主要介紹了python中的List sort()與torch.sort()使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Selenium+PhantomJS+python簡(jiǎn)單實(shí)現(xiàn)爬蟲的功能

    詳解Selenium+PhantomJS+python簡(jiǎn)單實(shí)現(xiàn)爬蟲的功能

    這篇文章主要介紹了詳解Selenium+PhantomJS+python簡(jiǎn)單實(shí)現(xiàn)爬蟲的功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 用Python的Django框架編寫從Google Adsense中獲得報(bào)表的應(yīng)用

    用Python的Django框架編寫從Google Adsense中獲得報(bào)表的應(yīng)用

    這篇文章主要介紹了用Python的Django框架編寫從Google Adsense中獲得報(bào)表的應(yīng)用,主要利用了官方的Google Adsense API,需要的朋友可以參考下
    2015-04-04
  • Python中map,reduce,filter和sorted函數(shù)的使用方法

    Python中map,reduce,filter和sorted函數(shù)的使用方法

    這篇文章主要介紹了Python中map,reduce,filter和sorted函數(shù)的使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • Python竟能畫這么漂亮的花,帥呆了(代碼分享)

    Python竟能畫這么漂亮的花,帥呆了(代碼分享)

    這篇文章主要介紹了用Python作圖的一個(gè)簡(jiǎn)單實(shí)例,通過(guò)turtle模塊實(shí)現(xiàn)作圖,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Pytorch高階OP操作where,gather原理

    Pytorch高階OP操作where,gather原理

    這篇文章主要介紹了Pytorch高階OP操作where,gather原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python利用遞歸方法實(shí)現(xiàn)求集合的冪集

    python利用遞歸方法實(shí)現(xiàn)求集合的冪集

    這篇文章主要給大家介紹了關(guān)于python利用遞歸方法實(shí)現(xiàn)求集合的冪集的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論