0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python到底是如何实现继承的呢

冬至配饺子 来源:多兰多 作者:Toranto 2022-08-18 15:46 次阅读

继承

通过__init__类构造方法我们可以看出,我们定义出来的盖伦类和瑞文类存在代码冗余的现象,而我们写程序,最好是以简洁为目的。如果两个程序都能达到相同的目标,一个五百行代码,而另一个只有三百行代码,毫无疑问我们选择后者。而且这也很方便我们查阅修改。

所谓继承,就是重用现有类的功能,并在此基础上进行扩展,将相关类的共性进行抽象、统一概念,隔离变化。

小明:“不会讲话你就多讲点。”

简单地说,在python中,新建的类可以继承一个或者多个类。父类又可以称为基类或者超类,新建的类称为派生类或者子类。

pYYBAGL97LqAP5eyAABs6DCMw1M861.png

简单地说,在python中,新建的类可以继承一个或者多个类。父类又可以称为基类或者超类,新建的类称为派生类或者子类。

poYBAGL97MSAQHkHAABl-ykIZS8247.pngpYYBAGL97PiAH9NtAACuPQjgkjw695.png


继续昨天的盖伦类和瑞文类:

pYYBAGL97RKADbKaAAEXjbnSljQ718.png


继承的原理(了解)

那么Python到底是如何实现继承的呢?

对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的为止。而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,只需要知道C3算法计算出来的列表,我找属性应该遵循什么样的原则:1、子类会先于父类被检查;

2、多个父类会根据它们在MRO列表中的顺序被检查;3、如果下一个类存在两个合法的选择(父类里面有重名的)选择第一个父类。

Python当中这个列表的产生,决定了你属性查找的方式,这个查找的方式分成两种:

深度优先(先深入继承树左侧查找,然后再返回,开始查找右侧)和广度优先(先从左到右水平方向上查找,最后再深入继承树右侧查找)。本质查找还是按照MRO列表,深度优先和广度优先的区别就是排列方式不一样。

在Python中类是分为两种的,新式类和经典类。这个区分只有pyhon2中才有,在python3里面已经没有经典类一说,都是新式类。

那么到底什么是新式类、经典类?

python2才有新式类和经典类的概念(继承了object的类就是新式类,反之就是经典类)。python3统一都是新式类,也就是都继承了object。

pYYBAGL97TaAdLVEAABPTsyClSM208.pngpoYBAGL97USAO6xcAAB2AFj4MIc147.pngpoYBAGL97V-AFEt1AABW2tNwdxI807.pngpYYBAGL97WOAbcY3AABhru66Ljk883.png

小明:“那个,那个,那个什么object的玩意儿是什么东西?”

Toranto:“我也不知道...”

小明:“来,吃药。”

在Python2中,默认都是经典类,只有显示继承了object的才是新式类:

poYBAGL97YCASXUMAAAypVpavFE146.png

在Python3中,取消了经典类,默认都是新式类,并且新式类不需要显示继承object对象。如下,这三种写法都可以,无区别:

poYBAGL97ZCAI8dFAAA1asGJVYk268.png

多态

我们都知道,在python中,当一个变量被多次赋值的时候,它的传达结果会表现为最后一次赋值,这是很典型的弱语言。

pYYBAGL97aaAY6cOAABYoimcdlA336.png


我们先后调用了Dog和Cat中的eat方法,a被先后赋值为“吃骨头”,“吃鱼”,但这并不是多态。

类的多态特性,需要满足以下两个条件:

1、继承:多态一定是发生在父类和子类之间;

2、重写:子类重写了父类的方法。

poYBAGL97b2AbL7mAAB65FwNiqM902.png

可以看到,Dog和Cat都继承自Animal类,且各自都重写了父类eat()方法。从运行结果可以看出,同一变量 a 在执行同一个 say() 方法时,由于 a 实际表示不同的类实例对象,因此 a.say() 调用的并不是同一个类中的 say() 方法,这就是多态。

换句话说,子类一旦重新定义了自己的属性或方法且与父类重名,那么调用新增的属性或方法时,就以自己为准了。

但有时候,在多态形成之后,我们又需要重新调用父类的同名方法时,我们有两个选择:

方法一:“指名道姓”地调用某个类的功能(函数)。

pYYBAGL97dOAO62tAABu9u18_7k246.png

方法二:super(),调用super()会得到一个特殊的对象,该对象专门用来引用父类的属性。

poYBAGL97eOAJUnOAABzygoRMFY266.png



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4599

    浏览量

    92618
  • python
    +关注

    关注

    55

    文章

    4779

    浏览量

    84440
收藏 人收藏

    评论

    相关推荐

    请问PCM2903C的温度范围到底是多少

    如下图,PCM2903C的温度范围到底是多少? 如果用在-25~85℃,是否会出问题?
    发表于 10-14 07:14

    放大器的共模输入电压到底是指什么?

    请问放大器的共模输入电压到底是指什么?
    发表于 09-19 07:17

    功放和运放到底是什么区别?

    想请问一下功放和运放到底是什么区别,感觉只要接一个小负载,运放的输出电流也可以很大啊?到底有什么区别啊
    发表于 09-10 07:00

    请问LMV772到底是双电源还是单电源啊?

    请问LMV772到底是双电源还是单电源啊?手册前面写的太模糊了。求指教
    发表于 09-09 07:10

    运放的输入电容到底是什么?

    我想请问一下运放的输入电容到底是什么?
    发表于 09-04 06:52

    LMH6502的输入电压到底是多少?

    LMH6502的输入电压到底是多少,我稍微给如大一点点的信号,放大不行还能接受,我衰减都失真,
    发表于 08-27 07:02

    运放旁路电容必须靠近芯片引脚的原因到底是什么

    运放旁路电容必须靠近芯片引脚的原因到底是什么?有的说是怕走线的电感与旁路电容形成谐振,旁路电容靠近运放的时候走线的电感不应该更大了吗(走线越长,走线的寄生电感也就越大)
    发表于 08-01 06:56

    对于STM8的固件库,到底是怎么对文件进行配置的?

    对于STM8的固件库,到底是怎么对文件进行配置的?
    发表于 05-17 15:59

    共享单车到底是什么通信原理

    我们经常骑的共享单车到底是什么通信原理,有人了解过吗? 一、智能车锁 共享单车最核心的硬件是智能车锁,主要用于实现控制和定位功能。
    发表于 04-09 10:33 805次阅读
    共享单车<b class='flag-5'>到底是</b>什么通信原理

    共享单车到底是什么通信原理?

    我们经常骑的共享单车到底是什么通信原理,有人了解过吗?下面宝蓝小编就带大家了解下。
    的头像 发表于 02-25 10:32 1335次阅读
    共享单车<b class='flag-5'>到底是</b>什么通信原理?

    请问M487KMCAN的SRAM到底是128KB还是160K?

    M487KMCAN的SRAM到底是128 KB 还是160K
    发表于 01-16 07:18

    直流电机的输出功率与运行速度之间的关系到底是怎样的?

    想请教各位高手两个问题: 1、直流电机的输出功率与运行速度之间的关系到底是怎样的, 最好能写出公式 2、我这里的直流电机是通过6RA70调速的, 是否能通过降低电机的运行速度来控制电机的输出功率,从而节约生产用电??
    发表于 12-26 06:55

    去耦滤波电容怎么布局摆放,到底是先大后小还是先小后大?

    去耦滤波电容怎么布局摆放,到底是先大后小还是先小后大?
    的头像 发表于 12-04 15:43 2285次阅读
    去耦滤波电容怎么布局摆放,<b class='flag-5'>到底是</b>先大后小还是先小后大?

    请问AD9684最低采样率到底是多少?

    关于AD9684最低采样率,数据手册有两处描述,但是不一致。请问AD9684最低采样率到底是多少?
    发表于 12-04 06:34

    AD8606到底是单电源供电还是双电源供电?

    为什么AD8606 的datasheet 上写的是单电源供地 (2.7V~5.5V),但是 ADI 的 应用笔记(CN0272)上AD8605的供地确实±5V?? 到底是单电源供地还是双电源供电???双电源供电不会坏掉吗??
    发表于 11-24 06:47