1. 程式人生 > >super在python中有什麽用

super在python中有什麽用

改變 並且 pytho www tar con print python lar

所屬網站分類: python高級 > 面向對象


作者:阿裏媽媽

鏈接:http://www.pythonheidong.com/blog/article/74/

來源:python黑洞網

有什麽區別?

class Child(SomeBaseClass):
    def __init__(self):
        super(Child, self).__init__()

class Child(SomeBaseClass):
    def __init__(self):
        SomeBaseClass.__init__(self)
我們已經看到super在只有單繼承的類中使用了很多,但也可以在多重繼承中使用它,那麽在這種情況下使用它的優點是什麽?

SomeBaseClass.__init__(self)
意味著調用SomeBaseClass的__init__。而

super(Child, self).__init__()

表示__init__從Child實例的方法解析順序(MRO)中的父類調用綁定。

如果實例是Child的子類,則MRO中可能會有另一個父級。

我玩了一下super(),並且認識到我們可以改變呼叫順序。

例如,我們有下一個層次結構:

 A
   /   B   C
   \ /
    D

在這種情況下,D的mro將是(僅適用於Python 3):

In [26]: D.__mro__
Out[26]: (__main__.D, __main__.B, __main__.C, __main__.A, object)
讓我們創建一個super()執行後調用的類。

In [23]: class A(object): #  or with Python 3 can define class A:
...:     def __init__(self):
...:         print("I‘m from A")
...:  
...: class B(A):
...:      def __init__(self):
...:          print("I‘m from B")
...:          super().__init__()
...:   
...: class C(A):
...:      def __init__(self):
...:          print("I‘m from C")
...:          super().__init__()
...:  
...: class D(B, C):
...:      def __init__(self):
...:          print("I‘m from D")
...:          super().__init__()
...: d = D()
...:
I‘m from D
I‘m from B
I‘m from C
I‘m from A

    A
   / ?
  B ⇒ C
   ? /
    D
因此我們可以看到解決方案順序與MRO中的相同。但是當我們super()在方法的開頭調用時:

In [21]: class A(object):  # or class A:
...:     def __init__(self):
...:         print("I‘m from A")
...:  
...: class B(A):
...:      def __init__(self):
...:          super().__init__()  # or super(B, self).__init_()
...:          print("I‘m from B")
...:   
...: class C(A):
...:      def __init__(self):
...:          super().__init__()
...:          print("I‘m from C")
...:  
...: class D(B, C):
...:      def __init__(self):
...:          super().__init__()
...:          print("I‘m from D")
...: d = D()
...: 
I‘m from A
I‘m from C
I‘m from B
I‘m from D
我們有一個不同的順序,它顛倒了MRO元組的順序。

  A
   / ?
  B ⇐ C
   ? /
    D 

super在python中有什麽用