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()第二个参数是类时,获得的方法是函数类型的,使用时不存在自动传参,第二个参数是对象时,获得的是绑定方法,能够自动传参。

结果:

相关文章
相关标签/搜索