Python类的继承即super()使用
Super
super()
函数是用于调用父类(超类)的一个方法,只有在新式类中可以使用super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO,Method Resolution Order,采用广度优先(区别于深度优先)的规则定义)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
语法
以下是 super() 方法的语法:
1 | # 菜鸟教程 |
参数
- type – 类(type),通常是当前子类。
- object-or-type – 类实例,一般是 self
含义
用self
这个实例对象去查找ThisClass
类的父类拥有的属性(成员方法、数据成员)
▲. Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
即平时写的
1 | class TestClass(object): |
完整代码
1 | class clsSuper(object): |
特点
super().func()
是不用传参self
的super(type, obj).func()
函数调用的是obj实例在MRO中下一个父类的可调用func(),而不是type的父类中的func()。即调用最近的可用func()- 使用
super()
不用指定父类的名称,便于修改维护;同时当继承多个类A、B的时候,用super().__init__()
相当于调用多个类的A.__ini__(self)
、B.__ini__(self)
与java对比
- Python中子类不会默认调用父类的构造函数,即下面代码。并不会要要求给传
name
。当然也可以理解为跟java一样调用了一个全空、没有任何内容的构造函数,但是在python中不需要显性写出来,原因部分是特点2(java中存在有参数的构造函数时,必须将空参数的构造函数显式写出,不然子类默认隐式调用空参数的构造函数时会报错说不存在)。 - Python中的构造函数只有一个。但由于存在
*arg,**kwarg
的存在,所以只要执行类型检查执行不同的代码;即实现了多个构造函数 - Python的类可以多继承,java只能单继承。
1 | class clsSuper(object): |
Author: Mrli
Link: https://nymrli.top/2019/07/07/Python类的继承-super-使用/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.