• Python3中super()的参数传递


    1、 super([type[, object-or-type]]) 

    super() 在使用时至少传递一个参数,且这个参数必须是一个类。

    通过super()获取到的是一个代理对象,通过这个对象去查找父类或者兄弟类的方法。

    2、super()不写参数的情况

    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会自动根据情况将两个参数传递给super

    在Python3中的类都是新式类,广度优先的查找顺序,在定义一个类时就会生成一个MRO列表(经典类没有MRO列表,深度优先),查找顺序就是按照这个列表中的类的顺序从左到右进行的。

    3、super(type) 只传递一个参数的情况

    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

    结果:

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

    其他方法都没有被调用。

    super() 只传递一个参数时,是一个不绑定的对象,不绑定的话它的方法是不会有用的

    4、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,根据顺序查找第一个参数(类)之后的类的方法

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

    结果:

  • 相关阅读:
    超市账单管理系统设计思路
    Hibernate之Query.uniqueResult()结果为数值的注意事项
    Hibernate之Query.uniqueResult()结果为数值的注意事项
    Struts2加载自定义库注意事项
    135编辑器使用方法
    SQLite – ORDER 子句
    Readings
    自己常用的导航工具
    Spring中的事件处理
    iOS-Runtime
  • 原文地址:https://www.cnblogs.com/yanlin-10/p/10272338.html
Copyright © 2020-2023  润新知