Python中类的多继承

Python中类的多继承

Python2.2之前类是没有共同的祖先的,之后,引入object类,它是所有类的共同祖先类object。Python2中为了兼容,分为古典类(旧式类)和新式类。Python3中全部都是新式类。新式类都是继承自object的,新式类可以使用super。

#一下代码在Python2.x中运行

#古典类(旧式类)
class A:pass

#新式类
class B(object):pass

print(dir(A))
print(dir(B))
print(A.__bases__)
print(B.__bases__)

#古典类
a = A()
print(a.__class__)
print(type(a)) #<type 'instance'>

#新式类
b = B()
print(b.__class__)
print(type(b))

多继承

OCP原则:多用“继承”、少修改
继承的用途:在子类上实现对基类的增强、实现多态
多态: 在面向对象中,父类、子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同表现,就是多态。一个类继承自多个类就是多继承,它将具有多个类的特征。

  • 多继承弊端
  1. 多继承很好的模拟了世界,因为事物很少是单一继承,但是舍弃简单,必然引入复杂性,带来了冲突。
  2. 多继承的实现会导致代码设计的复杂度增加,所以有些高级编程语言舍弃了类的多继承。
  3. C++支持多继承;Java舍弃了多继承。
    • Java中,一个类可以实现多个接口,一个接口也可以继承多个接口。Java的接口很纯粹,只是方法的声明,继承者 必须实现这些方法,就具有了这些能力,就能干什么。
  4. 多继承可能会带来二义性
  5. 实现多继承的语言,要解决二义性,深度优先或者广度优先。

Python多继承实现

class ClassName(基类列表):
    类体

class3_001

左图是多继承(菱形继承),右图是单一继承。
多继承带来路径选择问题,究竟继承哪个父类的特征呢?
Python使用MRO(method resolution order方法解析顺序)解决基类搜索顺序问题。

  • 历史原因,MRO有三个搜索算法:

    1. 经典算法:按照定义从左到右,深度优先策略。2.2版本之前 左图的MRO是MyClass,D,B,A,C,A
    2. 新式类算法:是经典算法的升级,深度优先,重复的只保留最后一个。2.2版本 左图的MRO是MyClass,D,B,C,A,object
    3. C3算法:在类被创建出来的时候,就计算出一个MRO有序列表。2.3之后,Python3唯一支持的算法 左图中的MRO是MyClass,D,B,C,A,object的列表
      • C3算法解决多继承的二义性
  • 经典算法有很大的问题,如果C中有覆盖A的方法,就不会访问到了,因为先访问A(深度优先)。

  • 新式类算法,依然采用了深度优先,解决了重复问题,但是同经典算法一样,没有解决继承的单调性。

  • C3算法,解决了继承的单调性,它阻止创建之前版本产生二义性的代码。求得的MRO本质是为了线性化,且确定 了顺序。

    1. 单调性:假设有A、B、C三个类,C的mro是[C, A, B],那么C的子类的mro中,A、B的顺序一致就是单调的。

多继承的缺点

当类很多,继承复杂的情况下,继承路径太多,很难说清什么样的继承路径。Python语法是允许多继承,但Python代码是解释执行,只有执行到的时候,才发现错误。团队协作开发,如果引入多继承,那代码很有可能不可控。不管编程语言是否支持多继承,都应当避免多继承。Python的面向对象,我们看到的太灵活了,太开放了,所以要团队守规矩。

Mixin

类有下面的继承关系

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值