亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解python的super()的作用和原理

 更新時間:2020年10月29日 09:07:16   作者:silencement  
這篇文章主要介紹了python的super()的作用和原理,super(), 在類的繼承里面super()非常常用, 它解決了子類調(diào)用父類方法的一些問題, 父類多次被調(diào)用時只執(zhí)行一次, 優(yōu)化了執(zhí)行邏輯,下面我們就來詳細(xì)看一下

Python中對象方法的定義很怪異,第一個參數(shù)一般都命名為self(相當(dāng)于其它語言的this),用于傳遞對象本身,而在調(diào)用的時候則不必顯式傳遞,系統(tǒng)會自動傳遞。

今天我們介紹的主角是super(), 在類的繼承里面super()非常常用, 它解決了子類調(diào)用父類方法的一些問題, 父類多次被調(diào)用時只執(zhí)行一次, 優(yōu)化了執(zhí)行邏輯,下面我們就來詳細(xì)看一下。

舉一個例子:

class Foo:

  def bar(self, message):

    print(message)
>>> Foo().bar("Hello, Python.")

Hello, Python.

當(dāng)存在繼承關(guān)系的時候,有時候需要在子類中調(diào)用父類的方法,此時最簡單的方法是把對象調(diào)用轉(zhuǎn)換成類調(diào)用,需要注意的是這時self參數(shù)需要顯式傳遞,例如:

class FooParent:

  def bar(self, message):

    print(message)

class FooChild(FooParent):

  def bar(self, message):

    FooParent.bar(self, message)
>>> FooChild().bar("Hello, Python.")

Hello, Python.

這樣做有一些缺點(diǎn),比如說如果修改了父類名稱,那么在子類中會涉及多處修改,另外,Python是允許多繼承的語言,如上所示的方法在多繼承時就需要重復(fù)寫多次,顯得累贅。為了解決這些問題,Python引入了super()機(jī)制,例子代碼如下:

class FooParent:

  def bar(self, message):

    print(message)

class FooChild(FooParent):

  def bar(self, message):

    super(FooChild, self).bar(message)
>>> FooChild().bar("Hello, Python.")

Hello, Python.

表面上看 super(FooChild, self).bar(message)方法和FooParent.bar(self, message)方法的結(jié)果是一致的,實(shí)際上這兩種方法的內(nèi)部處理機(jī)制大大不同,當(dāng)涉及多繼承情況時,就會表現(xiàn)出明顯的差異來,直接給例子:

代碼一

class A:

  def __init__(self):

    print("Enter A")

    print("Leave A")

class B(A):

  def __init__(self):

    print("Enter B")

    A.__init__(self)

    print("Leave B")

class C(A):

  def __init__(self):

    print("Enter C")

    A.__init__(self)

    print("Leave C")

class D(A):

  def __init__(self):

    print("Enter D")

    A.__init__(self)

    print("Leave D")

class E(B, C, D):

  def __init__(self):

    print("Enter E")

    B.__init__(self)

    C.__init__(self)

    D.__init__(self)

    print("Leave E")

E()

輸出結(jié)果

Enter E

Enter B

Enter A

Leave A

Leave B

Enter C

Enter A

Leave A

Leave C

Enter D

Enter A

Leave A

Leave D

Leave E

執(zhí)行順序很好理解,唯一需要注意的是公共父類A被執(zhí)行了多次。

代碼二

class A:

  def __init__(self):

    print("Enter A")

    print("Leave A")

class B(A):

  def __init__(self):

    print("Enter B")

    super(B, self).__init__()

    print("Leave B")

class C(A):

  def __init__(self):

    print("Enter C")

    super(C, self).__init__()

    print("Leave C")

class D(A):

  def __init__(self):

    print("Enter D")

    super(D, self).__init__()

    print("Leave D")

class E(B, C, D):

  def __init__(self):

    print("Enter E")

    super(E, self).__init__()

    print("Leave E")

E()

輸出結(jié)果

Enter E

Enter B

Enter C

Enter D

Enter A

Leave A

Leave D

Leave C

Leave B

Leave E

在super機(jī)制里可以保證公共父類僅被執(zhí)行一次,至于執(zhí)行的順序,是按照MRO(Method Resolution Order):方法解析順序 進(jìn)行的。

以上就是詳解python的super()的作用和原理的詳細(xì)內(nèi)容,更多關(guān)于python super()的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論