面向对象编程_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()方式调用父类方法,哪个类调用父类方法就按 该类的继承顺序去对应类中查找要执行的方法