Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Python类的继承-super()使用

2019/09/15 Python
Word count: 784 | Reading time: 3min

Python类的继承即super()使用

Super

super() 函数是用于调用父类(超类)的一个方法,只有在新式类中可以使用

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO,Method Resolution Order,采用广度优先(区别于深度优先)的规则定义)、重复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

语法

以下是 super() 方法的语法:

1
2
3
4
# 菜鸟教程
super(type [, object-or-type])
# 个人理解
super( ThisClass [, object(self)])

参数

  • type – 类(type),通常是当前子类。
  • object-or-type – 类实例,一般是 self

含义

self这个实例对象去查找ThisClass类的父类拥有的属性(成员方法、数据成员)

▲. Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :

即平时写的

1
2
3
4
5
6
7
class TestClass(object):
def __init__(self, *arg, **kwarg):
super(TestClass, self).__init__() # 此时init里不用self
# 等价于 super().__init__() , 含义是用父类的构造函数初始化某些变量
# 相当于旧式类的 object.__init__(self) # 需要传参self
self.arg = arg
self.kwarg = kwarg

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class clsSuper(object):
age = 18

def __init__(self, name):
print(name)


class clsSub(clsSuper):
def __init__(self):
print(super().age)
# 当只是单继承的时候可以直接使用 print(clsSuper.age),


if __name__ == '__main__':
a = clsSuper('cl')
b = clsSub()

特点

  • 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对比

  1. Python中子类不会默认调用父类的构造函数,即下面代码。并不会要要求给传name。当然也可以理解为跟java一样调用了一个全空、没有任何内容的构造函数,但是在python中不需要显性写出来,原因部分是特点2(java中存在有参数的构造函数时,必须将空参数的构造函数显式写出,不然子类默认隐式调用空参数的构造函数时会报错说不存在)。
  2. Python中的构造函数只有一个。但由于存在*arg,**kwarg的存在,所以只要执行类型检查执行不同的代码;即实现了多个构造函数
  3. Python的类可以多继承,java只能单继承。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class clsSuper(object):
age = 18

def __init__(self, name):
self.name = name
print(self.name)


class clsSub(clsSuper):
def __init__(self, age):
print(age)

'''
class clsSub(clsSuper):
def __init__(self, age):
super().__init__() #调用父类的构造函数
print(age)
'''

if __name__ == '__main__':
b = clsSub(18)

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.

< PreviousPost
yaml基础语法_spring_boot
NextPost >
Base64编码原理与应用[转]
CATALOG
  1. 1. Python类的继承即super()使用
    1. 1.1. Super
      1. 1.1.1. 特点
    2. 1.2. 与java对比