python3与python2类的定义与继承的区别:
1、类的定义:
# python3版本
class A:
def _init_(self):
print()
# python2版本
class A(object):
def _init_(self):
print()
2、python3中super().xxx 代替 super(Class, self).xxx
# python3
class B(A):
def add(self, x):
super().add(x)
# python2
class B(A):
def add(self, x):
super(B, self).add(x)
接下来聊一下对python3中类的继承问题
1、单继承
class A:
def __init__(self):
self.a = 6
def add(self, b):
print('self is @A.add')
self.a += b
class B(A):
def __init__(self):
self.a = 7
def add(self, b):
print('self is @B.add')
super().add(b)
self.a += 8
if __name__=='__main__':
b = B()
b.add(12)
print(b.a)
result:
self is @B.add
self is @A.add
27
因此:
1、super().add(b) 确实调用了父类 A 的 add 方法
2、super().add(b) 调用父类的方法时, 父类中 self 并不是父类的实例而是子类的实例, 所以刚开始self.a = 7而不是6
所以:
第一步:进入子类B中add方法,使用B中实例,self.a = 7
第二步:super().add(b),调用父类A的add方法,计算self.a = 7 + 12 = 19
第三步:调用子类B的add方法,计算self.a = 19 + 8 = 27
2、多继承
class C(A):
def __init__(self):
self.a = 2
def add(self, b):
print('self is @C.add')
super().add(b)
self.a += 15
class D(B, C):
def __init__(self):
self.a = 30
def add(self, b):
print('self is @D.add')
super().add(b)
self.a += 25
if __name__=='__main__':
d = D()
d.add(12)
print(d.a)
result:
self is @D.add
self is @B.add
self is @C.add
self is @A.add
90
因此调用步骤为:
第一步:进入子类D中add方法,使用D中实例,self.a = 30
第二步:super().add(b),调用D的父类B的add方法,计算self.a = 30 + 8 = 38
第三步:调用D的父类C的add方法,计算self.a = 38 + 15 = 53
第四步:调用B、C的父类A的add方法,计算self.a = 53 + 12 = 65
第五步:调用子类D的add方法,计算self.a = 65 + 25 = 90