博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
继承的实现原理
阅读量:5352 次
发布时间:2019-06-15

本文共 1178 字,大约阅读时间需要 3 分钟。

 

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

 
>>> F.mro() #等同于F.__mro__[
,
,
,
,
,
,
]
 

为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:

 
  1. 子类会先于父类被检查
  2. 多个父类会根据它们在列表中的顺序被检查
  3. 如果对下一个类存在两个合法的选择,选择第一个父类
 

在Java和C#中子类只能继承一个父类,而Python中子类可以同时继承多个父类,如果继承了多个父类,那么属性的查找方式有两种,分别是:深度优先和广度优先

#在python2中有新式类和经典类之说 #经典类:

 

class Foo: pass class Bar(Foo): pass #新式类:

 

class Foo1(object): pass class Bar1(Foo1): pass #在python3中只有新式类: class Foo2: pass class Bar2(Foo2): pass print(Bar2.__bases__) #__bases__是查找当前的类继承了几个父类 print(Foo2.__bases__) class A(object): def tset(self): print('from is A') class B(A): def test(self): print('from is B') class C(A): def test(self): print('from is C') class D(B): def test(self): print('from is E') class E(C): def tset(self): print('from is E') class F(D, E): def test(self): print('from is F') print(F.mro()) #mro()是以列表的形式显示出它的对象所调用属性的查找顺序 注意 mro方法只在python3中有效果 f = F() f.test()
#它们的继承顺序是F, D,B,E,C,A
 

转载于:https://www.cnblogs.com/yuexijun/p/10235981.html

你可能感兴趣的文章
windows下读取utf-8文件
查看>>
apache 启动不了的排查方法
查看>>
Java有没有goto?
查看>>
(转)makefile 的用法
查看>>
求不相邻金币相加和的最大值--动态规划1
查看>>
[转][osg]探索未知种族之osg类生物【目录】
查看>>
四十九. Zabbix报警机制 、 Zabbix进阶操作 、 监控案例
查看>>
元类中__new__ 与 __init__的区别--day27
查看>>
占小狼的简书博客
查看>>
struts2__action执行顺序
查看>>
php异常处理
查看>>
[xampp] /usr/bin/env: php: No such file or directory
查看>>
细学PHP 10 贴吧-2
查看>>
黑客攻防入门秘籍
查看>>
Swift迎来了1.0 GM 版(2014.09.09)
查看>>
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>