Python多继承

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

多继承

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

多继承弊端

多继承很好的模拟了世界,因为事物很少是单一继承,但是舍弃简单,必然引入复杂性,带来冲突。
多继承的实现会导致编译器设计的复杂度增加,所有有些高级编程语言舍弃了类的多继承
在这里插入图片描述
左图是多继承(菱形继承),右图是单一继承
多继承带来路径选择问题,究竟继承哪个父亲的特征呢
Python使用MRO(method resolution order方法解析顺序)解决基类搜索顺序问题

  • 历史原因,MRO有三个搜索算法:
    • 经典算法,按照定义从左到右,深度优先遍历,左图的MRO是Myclass,D,B,A,C,A
    • 新式类算法,是经典算法的升级,深度优先,重复的只保留最后一个,左图的MBO是Myclass,D,B,C,A,object
    • C3算法,在类被创建出来的时候,就计算出一个MRO有序列表,Python3唯一支持的算法左图的MRO是Myclass,D,B,C,A,object的列表,C3算法解决多继承的二义性
      经典算法有很大的问题,如果C中有覆盖A的方法,就不会访问到了,因为先访问A(深度优先)。
      新式类算法,依然采用了深度优先,解决了重复问题,但是同经典算法一样,没有解决继承的单调性。
      C3算法,解决了继承的单调性,它阻止了创建之前版本产生二义性的代码,来得的MRO本质是为了线性化,且确定了顺序。
多继承的缺点

当类很多,继承复杂的情况下,继承路径太多,很难说清什么样的继承路径。
Python语法是允许许多继承,但Python代码是解释执行,只有执行到的时候,才会发现错误。
团队协作开发,如果引入多继承,那代码很多可能不可控
不管编程语言是否支持多继承,都应当避免多继承。

Mixin

类有下面的继承关系
在这里插入图片描述
文档Document类是其他文档类的抽象基类
Word、Pdf类是Document的子类
需求:为Document子类提供打印能力
思路:

  • 1、基类中直接添加打印属性
  • 2 、需要打印在子类中添加
    在这里插入图片描述
    基类提供的方法可以不具体显示,因为它未必适合子类的打印,子类中需要覆盖重写,基类中之定义,不实现的方法,称为"抽象方法"。在Python中,如果采用这种定义的抽象方法,子类可以不实现,直到子类使用该方法的时候才报错。
  • 装饰器实现:
class Document:
    def __init__(self,content):
        self.content=content
    def print(self):
        raise NotImplementedError()
def add(fn):
    def a(self):
        print(self.content)
    fn.print_=a
    return fn
class Word(Document): pass
class Pdf(Document): pass
@add
class WordPrintable(Word): pass #定义新的类,不改变原来子类
@add
class PdfPrintable(Pdf): pass #定义新的类,不改变原来子类

在这里插入图片描述
优点:
简单方便,在需要的地方动态增加,直接使用装饰器。
可以为类灵活的增加功能

  • Mixin
class Document:
    def __init__(self,content):
        self.content=content
class Word(Document): pass
class Pdf(Document): pass
class PrintableMixin:
    def print(self):
        print(self.content,'Mixin')
class PrintableWord(PrintableMixin,Word): pass
print(PrintableWord.__dict__)
print(PrintableWord.mro())

在这里插入图片描述

Mixin类

Mixin本质上就是多继承实现。
Mixin体现的是一种组合的设计模式
在面向对象的设计中,一个复杂的类,往往需要很多功能,而这些功能有来自不同的类提供,这就需要很多的类组合在一起.
从设计模式的角度来说,多组合,少继承
Mixin类的使用原则:

  • Mixin类和装饰器
  • Mixin类通常不能独立工作,因为它是准备混入别的类中的部分功能实现
  • Mixin类的祖先类也应是Mixin类
    使用时,Mixin类通常在继承列表的第一个位置。
    Mixin类和装饰器,两种方式都可以使用,如果需要继承就要使用Mixin类的方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值