广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中类的多继承原理是什么
  • 417
分享到

Python中类的多继承原理是什么

2023-06-15 01:06:00 417人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章给大家分享的是有关python中类的多继承原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、Python不同版本的类Python2.2之前是没有共同的祖先的,

本篇文章给大家分享的是有关python中类的多继承原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、Python不同版本的类

  • Python2.2之前是没有共同的祖先的,之后引入Object类,它是所有类的共同祖先类Object

  • Python2中为了兼容,分为古典类(旧式类)和新式类

  • python3中全部都是新式类

  • 新式类都是继承自Object的,新式类可以使用super

#古典类在python2.x中运行class A: pass print(dir(A))            #    ['__doc__', '__module__']print(A.__bases__)        #    ()a = A()    print(a.__class__)        #     __main__.A   print(type(a))            #    <type 'instance'>

新式类

#新式类在python3.x中运行class B: pass print(dir(B))   #   ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__fORMat__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']print(B.__bases__)  #   (<class 'object'>,)B = B()print(B.__class__)  #   <class '__main__.B'>print(type(B))      #   <class '__main__.B'>

二、多继承

OCP原则:多用”继承“,少修改

继承的用途:增强基类,实现多态

多态

  • 面向对象中,父类、子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同变现,就是多态

  • 一个类继承自多个类就是多继承它将具有多个类的特征

三、多继承弊端

多继承很好的模拟了世界,因为事务很少单一继承,但是舍弃简单,必然引入复杂性,带来了冲突

如同一个孩子继承了来自父母双方的特征,那么到底眼睛像爸爸还是妈妈尼?孩子究竟改像谁多一点尼?

多继承的实现会导致编译器设计的复杂度增加,所以现在很多语言舍弃了类的多继承

c++支持多继承;Java舍弃了多继承

  • Java中,一个类可以实现多个接口,一个接口也可以继承多个接口。Java的接口很纯粹,只是方法声明,继承者必须实现这些方法,就具有了这些能力,就能干什么

多继承可能会带来二义性,例如,猫和狗都继承自动物类,现在一个类多继承了猫和狗类,猫和狗都有了shout方法,子类究竟继承谁的shout尼?

  • 解决方案:实现了多继承的语言,要解决二义性,深度优先或者广度优先

四、Python多继承实现

class ClassName(基类列表):    类体

Python中类的多继承原理是什么

多继承带来的路径选择问题,究竟继承那个父类的特征尼?

  • 究竟先广度优先,还是深度优先

Python使用MRO(method resolution order) 解决类搜索顺序问题。

  • 经典算法,按照定义从左到右,深度优先策略【比如Python2.2之前,左图的MRO算法,MyClass→D→B→A→C→A】

  • 新式类算法,经典算法的升级,重复的只保留最后一个。【左图MRO是:MyClass→D→B→C→A→object】

  • C3算法,在类被创建出来的时候,就计算除一个MRO有序列表。【Python3唯一支持的算法,左图中MRO是MyClass→D→B→C→A→object】C3过于复杂,没必要去记,我们只要记住【object.mro(),显示继承的方法,从左到右依次查找】

五、多继承的缺点

当类很多,继承复杂的情况下,继承路径太多,很难说清什么样的继承路径

团队协作开发,如果引入多继承,那代码将不可控

不管编程语言是否支持多继承,都应当避免多继承

Pythond的面向对象,我们看到太灵活,太开放,所以要团队守规矩

六、Mixin 

类有下面的继承关系

Python中类的多继承原理是什么

文档Document类是其他所有文档类的抽象基类,Wordpdf类是Document的子类

需求:为Document子类提供打印能力思路:

在Document中提供print方法

class Document:     def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document): pass class Pdf(Document):  pass a = Word("tom com")a.print()   #   tom com

基类提供的方法不因该具体实现,因为它未必适合子类的打印,子类中需要覆盖重写。

print算是一种能力 -- 打印功能,不是所有的Document的子类都需要的,所以,从这个角度出发有点问题

class Document:     def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document):    def print(self):        print("Word print {}".format(self.coutent)) class Pdf(Document):  pass a = Word("tom com")a.print()   #   Word print tom com

思路二:需要打印的子类上增加

如果现有子类上直接增加,违反了OCP的原则,所以应该继承后增加

Python中类的多继承原理是什么

class Document:        # 不允许修改    def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document): pass    # 不允许修改 class Pdf(Document):  pass    #    不允许修改 class PrinttableWord(Word):        def print(self):        print("PrinttableWord print {}".format(self.coutent)) print(PrinttableWord.mro()) #   [<class '__main__.PrinttableWord'>, <class '__main__.Word'>, <class '__main__.Document'>, <class 'object'>]a = PrinttableWord("tom com")a.print()   #   PrinttableWord print tom com

看似不错,如果还要提供其他类似能力,如何继承?

应用于网络,文档应该具备序列化的能力,类上就应该实现序列化可序列化还可能分为使用pickle、josn、messagepack等

这个时候,发现,类又可能太多了,继承的方式不是很好了

功能太多,A类需要某几样功能,B类需要另外几样功能,很繁琐

思路三:装饰器,用装饰器增强一个类,把功能给类附加上去,那个类需要,就装饰它

def printable(cls):    def _print(self):        print("_print 装饰器 {}".format(self.coutent))        return _print    cls.print = _print    return cls class Document:    def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document): pass class Pdf(Document):  pass @printableclass PrinttableWord(Word): pass    #先继承,后装饰  print(PrinttableWord.__dict__)  #   {'__module__': '__main__', '__doc__': None, 'print': <function printable.<locals>._print at 0x0173C228>}a = PrinttableWord("tom")a.print()   #   _print 装饰器 tom

优点:简单方便,在需要的地方动态增加

思路四:Mixin  【用类去继承】

先看代码

class PrintableMixin:    def print(self):        print("PrintableMixin {}".format(self.coutent)) class Document:    def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document): pass class Pdf(Document):  pass  class PrinttableWord(PrintableMixin,Word): pass     print(PrinttableWord.mro())     #   [<class '__main__.PrinttableWord'>, <class '__main__.PrintableMixin'>, <class '__main__.Word'>, <class '__main__.Document'>, <class 'object'>]print(PrinttableWord.__dict__)  #   {'__module__': '__main__', '__doc__': None}a = PrinttableWord("tom")a.print()   #   PrintableMixin tom

Mixin就是其他类混合进来,同时带来了类的属性和方法

这里看来Mixin类和装饰器效果一样,也什么特别的,但是Mixin是类,就可以继承,增强功能

class PrintableMixin:    def print(self):        print("PrintableMixin {}".format(self.coutent)) class Document:    def __init__(self,content):        self.coutent = content     def print(self):        print(self.coutent) class Word(Document): pass class Pdf(Document):  pass  class PrinttableWord(PrintableMixin,Word): pass class SuperPrintableMixin(PrintableMixin,Word):    def print(self):        print("~"*30)        super(SuperPrintableMixin, self).print()        print("~"*30) print(SuperPrintableMixin.mro())     #  [<class '__main__.SuperPrintableMixin'>, <class '__main__.PrintableMixin'>, <class '__main__.Word'>, <class '__main__.Document'>, <class 'object'>]print(SuperPrintableMixin.__dict__)  #  {'__module__': '__main__', 'print': <function SuperPrintableMixin.print at 0x018264B0>, '__doc__': None}a = SuperPrintableMixin("tom")a.print()   #   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~            #   PrintableMixin tom            #   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

七、Mixin类

Minxin本质上就是多继承实现的

Mixin体现的是一种组合的设计模式

在面向对象的设计中,一个负载的类,往往需要很多功能,而这些功能有来自不同的类提供,这就需要很多的类组合在一起

从设计模式的角度来说,多组合,少继承。

  • Mixin类的使用原则

  • Mixin类中不应该显示的出现__init__初始化方法

  • Mixin类通常不能独立工作,因为它是准备混入别的类中的部分功能实现

  • Mixin类的祖先类也应该是Mixin类

  • 使用时,Mixin类通常在继承列表第一个位置,例如:class PrintableWord(PrintableMixin,Word):pass

python可以做什么

Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗易懂、容易入门、功能强大,在许多领域中都有广泛的应用,例如最热门的大数据分析人工智能web开发等。

以上就是Python中类的多继承原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网Python频道。

--结束END--

本文标题: Python中类的多继承原理是什么

本文链接: https://www.lsjlt.com/news/276517.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中类的多继承原理是什么
    本篇文章给大家分享的是有关Python中类的多继承原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、Python不同版本的类Python2.2之前是没有共同的祖先的,...
    99+
    2023-06-15
  • Python继承的原理是什么
    Python继承的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、原理分析子类会先于父类被检查。多个父类会根据它们在列表中的顺序被检查。如果对下一个...
    99+
    2023-06-15
  • java类的继承原则是什么
    Java类的继承原则是通过一个类(子类)继承另一个类(父类)的特性和行为。以下是Java类继承的原则:1. 单一继承:Java中的类...
    99+
    2023-10-18
    java
  • C++ 中继承的原理是什么
    今天就跟大家聊聊有关C++ 中继承的原理是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。继承1 什么是继承1.1 继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段...
    99+
    2023-06-14
  • Python类中的单继承和多继承用法
    本篇内容主要讲解“Python类中的单继承和多继承用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python类中的单继承和多继承用法”吧!前言Python面向对象编程语言,有List、Str...
    99+
    2023-06-02
  • es6继承的原理是什么
    ES6继承的原理是通过使用`class`关键字和`extends`关键字来创建子类,并通过`super`关键字调用父类的构造函数和方...
    99+
    2023-10-09
    es6
  • python子类在多继承中使用MRO机制原理
    目录子类在多继承中使用MRO机制算法原理查看MRO列表子类在多继承中使用MRO机制 在Python中,当定义一个类时,可以指定它的父类。一个子类继承了其所有父类的属性和方法,并且可...
    99+
    2023-03-24
    python子类多继承MRO python子类多继承MRO
  • Python中的继承和多态是什么
    这篇文章主要讲解了“Python中的继承和多态是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的继承和多态是什么”吧!一、继承的介绍继承是一种创建新的类的方式,新创建的叫子...
    99+
    2023-06-15
  • javascript的原型式继承的原理是什么
    这篇文章给大家介绍javascript的原型式继承的原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、说明利用空对象作为中介,将某个对象直接分配给空对象构造函数的原型。2、缺点原型链继承多个实例的引用类型属性...
    99+
    2023-06-15
  • python继承的基类属性是什么
    这篇文章将为大家详细讲解有关python继承的基类属性是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pil...
    99+
    2023-06-14
  • Javascript中类式继承和原型式继承有什么区别
    这篇文章主要介绍了Javascript中类式继承和原型式继承有什么区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在所有面向对象的编程中,...
    99+
    2022-10-19
  • C++继承的实现原理是什么
    C++继承的实现原理是通过派生类继承基类的成员和方法。当一个派生类继承一个基类时,派生类会拥有基类的所有成员变量和成员函数。在内存中...
    99+
    2023-10-26
    C++
  • java什么是类的继承
    Java 中类的继承是通过扩展其他类而形成新类来实现的,原来的类称为父类(super class)或基类,新类称为原来类的子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法,使得父类的基本特征可被所有子类的对象共享。...
    99+
    2014-09-27
    java 继承
  • Javascript的类继承是什么
    本篇内容介绍了“Javascript的类继承是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说到Jav...
    99+
    2022-10-19
  • php中类继承与接口继承的区别是什么
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php中类继承与接口继承的区别是什么PHP类继承:PHP类不支持多继承,也就是子类只能继承一个父类,但是支持多层次继承比如:class frist{ public...
    99+
    2015-02-22
    PHP
  • 怎么理解Python类的继承
    这篇文章主要讲解了“怎么理解Python类的继承”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Python类的继承”吧!1、对继承的理解继承(Inheritance) :代码复用的高...
    99+
    2023-06-25
  • python中多继承的查找顺序是什么
    python中多继承的查找顺序是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pyt...
    99+
    2023-06-14
  • Java不支持多继承的原因是什么
    这篇文章主要介绍“Java不支持多继承的原因是什么”,在日常操作中,相信很多人在Java不支持多继承的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java不支持多继承的原因是什么”的疑惑有所帮助!...
    99+
    2023-07-05
  • Javascript继承机制的设计原理是什么
    这篇文章主要讲解了“Javascript继承机制的设计原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Javascript继承机制的设计原理是什么”...
    99+
    2022-10-19
  • 怎么在python中实现继承的多种类型
    本篇文章给大家分享的是有关怎么在python中实现继承的多种类型,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、类型说明(1)单一继承单级继承使派生类能够从单个父类继承特征。...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作