python3的super详解并与python2的区别

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

参考:
https://www.cnblogs.com/Jesee/p/10862424.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。