面向对象编程_python_super()方法

1、在python  中 super() 方法的使用场景:

在类的继承中,子类重写了父类的方法,但有想在子类中调用父类的方法时,就需要用到super()

或者说,子类重写父类方法后,实现了子类特有的一些功能 ,但同时又以来 父类方法 实现其他功能的情况下 就会使用super

 

2、代码示例:

单继承

'''单继承'''

class A:

    def f1(self):
        print('A的f1')

class B(A):
    def f1(self):
        print('B的f1')
        '''
        super().f1() 表示从当前类中的继承关系的下一类中去寻找f1,这里当前是B类,按照继承顺序,下一个基类(父类)是A类,
        故这里执行f1方法 应该去A类中去查找

        '''
        super().f1()



b = B()
b.f1()

 

多继承:

示例1

class A:

    def f1(self):
        print('A的f1')
class B:
    def f1(self):
        # super().f1() 表示从当前类中的继承关系的下一类中去寻找f1,这里当前类是B类,按照C类继承顺序B,A 下一类就是 A ,
        # 所以 这里的super().f1()执行的是A类中的f1
        print('B的f1')
        super().f1()

class C(B,A):
    pass

obj = C()
obj.f1()
''' 执行结果: B的f1 A的f1 '''

 

示例2

class A:

    def f1(self):
        print('A的f1')

class B(A):
def f1(self): print('B的f1') # super().f1() 表示从当前实例对象类的继承关系的下一类中去寻找f1,这里进入了B类,按照D类继承顺序D,B,C,A 下一类就是 C , super().f1() class C(A): def f1(self): print('C的f1') # super().f1() 表示从当前实例对象类的继承关系的下一类中去寻找f1,这里进入了C类,按照D类继承顺序D,B,C,A 下一类就是 A , super().f1() class D(B,C):
def f1(self): print('D的f1') super().f1() # 获取D类的mro 即方法解性顺序(子类调用基类方法时,按照mro定义的顺序 从对应类中查找指定的方法,简单理解就是:继承时查找对应方法或者数据时的顺序 ) print(D.__mro__) # D类的继承顺序:(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) d1 = D() d1.f1() ''' 执行结果: D的f1 B的f1 C的f1 A的f1 '''

 

super调用的其他写法:

'''两种写法是等价的'''
super(子类名, self).父类方法() 

super().父类方法()  

 

3、子类中调用父类的其他方法

比如在python 2.xx 中使用以下方式 调用父类或者其他类中的方法 

父类.方法名(self) 

参考地址:https://www.cnblogs.com/byhh/p/15524749.html

 

4、总结:

通过super()调用父类方法时,按照的时mro 方法解析性顺序 去查找对应的基类方法(查找并执行方法的时候存在顺序,而不是单纯的 在父类中去执行)

简而言之 :通过super()方式调用父类方法,哪个类调用父类方法就按 该类的继承顺序去对应类中查找要执行的方法

 

 

posted @ 2021-11-08 19:22  昆虫白  阅读(96)  评论(0)    收藏  举报