Python入门基础学习(super详解)

super的使用/介绍

super通俗理解:用来调用父类方法

理解super之前,需要回顾区分一下python的版本中的继承与super使用

继承:在python2创建新类,需要标明父类object(所有类的父类皆为object)

# Python 3
class A:
    pass

# Python 2
class A(object):
    pass

super的使用:Python3可以使用直接使用 super().xxx 代替 super(Class, self).xxx

# 默认,Python 3
class B(A):
    def add(self, x):
        super().add(x)

# Python 2
class B(A):
    def add(self, x):
        super(B, self).add(x)

 

super的作用(单继承)

先来看super的基础作用,即作为父类的引用调用父类属性/方法

class A:
    def __init__(self):
        self.n = 2

    def add(self, m):
        print('self is {0}'.format(self))
        self.n += m

class B(A):
    def __init__(self):
        self.n = 3

    def add(self, m):
        print('self is {0}'.format(self))
        super().add(m)
        self.n += 3

b = B()
b.add(2)
print(b.n)
# 输出结果
# self is <__main__.B object at 0x000001F5B7D96FA0>
# self is <__main__.B object at 0x000001F5B7D96FA0>
# 8

通过上述结果,可以说明B通过super确实可以调用A(父类)的add方法,而调用时,A的self此时已经变成了B

所以调用A的add方法时,n = 3 + 2,总的结果=3 + 2 + 3

--------------------------------------------------------------------------------------------------

单类继承中,其意义就是不需要父类的名称来调用父类的函数,因此当子类改为继承其他父类的时候,不需要对子类内部的父类调用函数做任何修改就能调用新父类的方法

class base1(object):                # class base2(object):
    def __init__(self):             #    def __init__(self): 
        print "base1 class"         #        print "base2 class"

                                    # 若继承父类需要换成base2
class A(base1):                     # class A(base2):
    def __init__(self):             #     def __init__(self):
        base1.__init__(self)        #         base2.__init__(self)    

class B(base1):                     # class B(base2):
    def __init__(self):             #     def __init__(self):
        super(B, self).__init__()   #         super(B, self).__init__()

这里可以看出子类B在继承父类时,不会因为父类从base1->base2,调用方式发生改变

 

super的作用(多继承)

理解多继承之前,先刨析super

大多数情况下, super 包含了两个非常重要的信息: 一个 MRO 以及 MRO 中的一个类。如下示例理解

python中可以使用可以通过 D.mro() (Python 2 使用 D.__mro__ ) 来查看 D 的 MRO 信息

MRO为一个列表,如

[A, B, C, D, E, object]

若调用多个父类中的foo()方法

super(C, A).foo()

MRO中的一个类就是C(第一个)

则调用顺序从MRO中的C依次类推,调用C,D,E,object

 

posted @ 2022-01-18 15:45  SiNanhong  阅读(168)  评论(0编辑  收藏  举报