最普通的继承
class Father():
def __init__(self):
print('Father')
class Son(Father):
def __init__(self):
print('Son')
super().__init__()
son = Son()
儿子实现了自己的构造函数_init_()的同时继承了爹的构造函数
实例化一个儿子的时候,在儿子的构造函数内,先执行自身的print,再执行爹的构造函数,所以——
Son
Father
当然了也可以反一反
class Son(Father):
def __init__(self):
super().__init__()
print('Son')
这样子就是父慈子孝了(雾
开始套娃
现在我有这样三个类
class GrandFather:
...
class Father(GrandFather):
...
class Son(Father):
...
出于某些原因,我希望在Son中去调用GrandFather的构造函数,而Father没有构造函数,换言之,架空爹,直接向太上皇汇报(有这样的儿子肯定往死里打……
实际上,super().__init__() 是缩写
真实的完整的写法是super(Son, self).__init__()
含义是调用Son的父类
所以如果我们把Son替换为Father,是否就可以调用Father 的父类,也就是GrandFather的构造函数了呢?
是的,可以
class GrandFather:
def __init__(self):
print('GrandFather')
class Father(GrandFather):
def __init__(self):
print('Father')
class Son(Father):
def __init__(self):
print('Son')
super(Son, self).__init__()
print('准备绕过爹')
super(Father, self).__init__()
son = Son()
如上的示例中,Son先调用了Father的构造函数,但Father并没有直接调用GrandFather的构造函数,而是被Son跳过了Father直接调用
Son
Father
准备绕过爹
GrandFather
我的某个程序中,有一个通用的抽象作为GrandFather,大部分模块都只到Father这一层,但又有少部分模块有一些共性,但是细节上不同,所以又派生出了Son这一层,于是我就找如何跳过Father这一层去调用GrandFather的构造函数
这些少部分的模块,Father的构造函数代码处理一些通用的数据逻辑,所以也就没有调用GrandFather的构造函数
嗯,大概率几个月后我就看不懂我写了啥了(大雾
一个小坑
在这个情况下,Father切记不能写成__Father
否则就会变成这样
Son
Father
准备绕过爹
Traceback (most recent call last):
File "d:/OneDrive/1_python_project/py_learn/class3.py", line 16, in
son = Son()
File "d:/OneDrive/1_python_project/py_learn/class3.py", line 14, in __init__
super(__Father, self).__init__()
NameError: name '_Son__Father' is not defined
看起来__Father没办法被进一步调用了