Python的单继承和多重继承

我们用两部分来写写Python的继承,分为单继承和多继承。在《流畅的Python》11和12章介绍了协议和抽象基类,以及继承的优点缺点,抽象基类这块真的很抽象…我觉得自己能看懂,却真的写不出来啥,乱写一通没有啥意思,我实在是写不好。我们就来写写继承好了,以及Python继承的一些调用方式。

第一部分,单继承

和C++的继承一样,子类可以继承父类的方法,我们从一个简单的例子说起

class A():
    def fun(self):
        print('A class fun here')

class B(A):
    pass

b = B()
b.fun()
'''输出
A class fun here
'''

就和我们预想的一样,虽然B类中没有fun()函数,但是因为B继承自A,所以可以调用A的fun()函数。那么如果我们在B里也定义fun()函数呢?

class B(A):
    def fun(self):
        print('B class fun here')
b = B()
b.fun()
'''输出
B class fun here
'''

这样情况下将会优先调用子类的对应函数。但是我们仍然可以显示的去执行父类的函数,比如这样

class A():
    def fun(self):
        print('A class fun here')

class B(A):
    def fun(self):
    	#这两种写法都是可以的
        super().fun()
        #super(B,self).fun()

b = B()
b.fun()
'''输出
A class fun here
'''

利用super()函数,我们可以选择调用父类的函数,很多时候我们都需要在子类的初始化函数中调用父类的初始化函数__init__()

第二部分,多重继承

结合单继承的几个例子,我们看看Python多继承是如何执行的

class A():
    def fun(self):
        print('A class fun here')

class B():
    def fun(self):
        print('B class fun here')

class C(A,B):
    pass

# class C(B,A):
#     pass

c = C()
c.fun()
#输出 A class fun here

此时C继承A和B,这个时候我们调用fun(),发现执行的是A的fun(),为什么不是B的呢?我们尝试把继承的顺序调换一下看看

class A():
    def fun(self):
        print('A class fun here')

class B():
    def fun(self):
        print('B class fun here')

# class C(A,B):
#     pass

class C(B,A):
    pass

c = C()
c.fun()
#输出 B class fun here

我们发现这个时候,执行的是B的fun(),看来到底执行那个父类的方法并不是随机的,是由什么东西控制的。其实关键就是一个叫做MRO的东西,我们看看下列代码

class A():
    def fun(self):
        print('A class fun here')

class B():
    def fun(self):
        print('B class fun here')

class C1(A,B):
    pass

class C2(B,A):
    pass

print('C1 MRO',C1.__mro__)
print('C2 MRO',C2.__mro__)
C1().fun()
C2().fun()
'''输出
C1 MRO (<class '__main__.C1'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
C2 MRO (<class '__main__.C2'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
A class fun here
B class fun here
'''

在发现子类中没有对应方法后,开始在父类中寻找对应方法,寻找是按照一个顺序进行的,这个顺序就存放在类的__mro__成员变量中。(object是python中所有定义的类的超类,在python2中,自定义的类都要继承自object,python3中则不需要再显示的写出来,但是仍然会继承自object)
关于Python的MRO,其实还有很多细节部分,是的,我完全写不了,,有兴趣了解的可以查看专门的介绍,另外,抽象类的继承还有更多的细节。

第三部分,总结

子类首先在自己的方法里找,若是找不到的话就会去继承的父类中找,单继承自然是去唯一的父类中找,若是多继承,则按照__mro__的顺序进行查找。

虽然我进行了检查,但是也难免有出错,若有错误望指出

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值