一、前言
super(father).__init__()
目的:调用父类的__init__()函数进行初始化
2、应用场景:
class A():
def __init__(self):
self.a=100
self.b='xxx'
self.c=True
def func1(self):
pass
如上,有类A,现在想创建类B继承类A,但是类B的self.c需要改为False,我们尝试实现
class B(A):
def func2(self):
pass
好像 不行,又或者
class B(A):
def __init__(self):
self.c=False
def func2(self):
print(self.b)
b=B()
b.func2()
//会报错'B' object has no attribute 'b',因为你重写了__init__()
很显然也不行,所以super(子类,self).__init__()发挥作用了
class B(A):
def __init__(self):
super(B,self).__init__()
self.c=False
def func2(self):
print(self.b)
print(self.c)
b=B()
b.func2()
输出:
xxx
False
成功了!!!
问题:super调用父类的init方法进行初始化,那当父类的init方法中有调用方法时,则这时候是调用父类的还是调用子类的呢(当然前提是子类有重写父类的方法)?
三、进阶理解
class A():
def __init__(self,a,b):
self.a=a
self.b=b
print(self.b)
self.prints()
def prints(self):
print('self.A:',self.a)
class Zilei(A):
def __init__(self,a):
super(Zilei, self).__init__(a,a+1)
self.a = a+100
print('self.a:', self.a)
def prints(self):
print('self.b:',self.b)
ass=Zilei(1)
# 1/ 先执行super(Zilei, self).__init__(a,a+1),即执行A.__init__
# 所以输出print(self.b),即2
# 再执行self.prints() ,值得注意的是A.prints(),在子类zilei被重写,所以应该执行的是zilei.prints(),即输出:self.b:2
#2/返回到zilei.__init__执行print('self.a:', self.a) 输出 self.a:101
# 最终输出的结果:
# 2
# self.b:2
# self.a:101
看完上述分析,答案很明显是:调用子类重写后的方法