Python3中super()的參數傳遞

一、 super([type[, object-or-type]]) ide

super() 在使用時至少傳遞一個參數,且這個參數必須是一個類。函數

經過super()獲取到的是一個代理對象,經過這個對象去查找父類或者兄弟類的方法。spa

二、super()不寫參數的狀況3d

class Base:
    def __init__(self):
        print('Base.__init__')


class A(Base):
    def __init__(self):
        super().__init__()
        print('A.__init__')


class B(Base):
    def __init__(self):
        super().__init__()
        print('B.__init__')


class C(Base):
    def __init__(self):
        super().__init__()
        print('C.__init__')


class D(A, B, C):
    def __init__(self):
        super().__init__()  # 等同於 super(D, self).__init__()
        print('D.__init__')


D()

print(D.mro())
View Code

結果:代理

Base.__init__
C.__init__
B.__init__
A.__init__
D.__init__
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>]

super() 在一個定義的類中使用時,能夠不寫參數,Python會自動根據狀況將兩個參數傳遞給supercode

在Python3中的類都是新式類,廣度優先的查找順序,在定義一個類時就會生成一個MRO列表(經典類沒有MRO列表,深度優先),查找順序就是按照這個列表中的類的順序從左到右進行的。對象

三、super(type) 只傳遞一個參數的狀況blog

class Base:
    def __init__(self):
        print('Base.__init__')


class A(Base):
    def __init__(self):
        super().__init__()
        print('A.__init__')


class B(Base):
    def __init__(self):
        super().__init__()
        print('B.__init__')


class C(Base):
    def __init__(self):
        super().__init__()
        print('C.__init__')


class D(A, B, C):
    def __init__(self):
        super(B).__init__()  # 值傳遞一個參數
        print('D.__init__')


D()

print(D.mro())
View Code

結果:it

D.__init__
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>]

其餘方法都沒有被調用。event

super() 只傳遞一個參數時,是一個不綁定的對象,不綁定的話它的方法是不會有用的

四、super(type, obj) 傳遞一個類和一個對象的狀況

class Base:
    def __init__(self):
        print('Base.__init__')


class A(Base):
    def __init__(self):
        super().__init__()
        print('A.__init__')


class B(Base):
    def __init__(self):
        super().__init__()
        print('B.__init__')


class C(Base):
    def __init__(self):
        super().__init__()
        print('C.__init__')


class D(A, B, C):
    def __init__(self):
        super(B, self).__init__()  # self是B的子類D的實例
        print('D.__init__')


D()

print(D.mro())
View Code

結果:

Base.__init__
C.__init__
D.__init__
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>]

super() 的參數爲一個類和一個對象的時候,獲得的是一個綁定的super對象。可是obj必須是type的實例或者是子類的實例。

從結果能夠看出,只是查找了B類以後的類的方法,

super()是根據第二個參數(obj)來計算MRO,根據順序查找第一個參數(類)以後的類的方法

五、super(type1, type2) 傳遞兩個類的狀況

class Base:
    def __init__(self):
        print('Base.__init__')


class A(Base):
    def __init__(self):
        super().__init__()
        print('A.__init__')


class B(Base):
    def __init__(self):
        super().__init__()
        print('B.__init__')


class C(Base):
    def __init__(self):
        super().__init__()
        print('C.__init__')


class D(A, B, C):
    def __init__(self):
        super(B, D).__init__(self)  # D是B的子類,而且須要傳遞一個參數
        print('D.__init__')


D()

print(D.mro())
View Code

結果:

Base.__init__
C.__init__
D.__init__
[<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.Base'>, <class 'object'>]

super()傳遞兩個類type1和type2時,獲得的也是一個綁定的super對象,但這須要type2是type1的子類,且若是調用的方法須要傳遞參數時,必須手動傳入參數,由於super()第二個參數是類時,獲得的方法是函數類型的,使用時不存在自動傳參,第二個參數是對象時,獲得的是綁定方法,能夠自動傳參。

結果:

相關文章
相關標籤/搜索