python mro c3_Python 19 MRO和C3算法

1.python经典类的MRO

经典类的MRO

class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E: pass class F(D, E): pass class G(F, D): pass class H: pass class Foo(H, G): pass

20181119171257893843.png

enter description here

20181119171258024703.png

20181119171258312789.png

2. python新式类的MRO, C3算法

新式类的MRO

class A: pass class B(A): pass class C(A): pass class D(B, C): pass class E(C, A): pass class F(D, E): pass class G(E): pass class H(G, F): pass

首先. 我们要确定从H开始找. 也就是说. 创建的是H的对象.

如果从H找. 那找到H+H的?类的C3, 我们设C3算法是L(x) , 即给出x类. 找到x的MRO

L(H) = H + L(G) + L(F)

继续从代码中找G和F的?类往??带

L(G) = G + L(E)

L(F) = F + L(D)+ L(E)

继续找E 和 D

L(E) = E + L(C) + L(A)

L(D) = D + L(B) + L(C)

继续找B和C

L(B) = B + L(A)

L(C) = C + L(A)

最后就剩下一个A了. 也就不用再找了. 接下来. 把L(A) 往回带. 再推回去. 但要记住. 这?的

表示的是merge. merge的原则是?每个元组的头一项和后一元组的除头一项外的其他元

素进行比较, 看是否存在. 如果存在. 就从下一个元组的头一项继续找. 如果找不到. 就拿出来.

作为merge的结果的一项. 以此类推. 直到元组之间的元素都相同. 也就不?再找了.

L(B) =(B,) + (A,) -> (B, A)

L(C) =(C,) + (A,) -> (C, A)

继续带.

L(E) = (E,) + (C, A) + (A) -> E, C, A

L(D) = (D,) + (B, A) + (C, A) -> D, B, A

继续带.

L(G) = (G,) + (E, C, A) -> G, E, C, A

L(F) = (F,) + (D, B, A) + (E, C, A) -> F, D, B, E, C, A

加油,

算完了. 最终结果 HGFDBECA. 那这个算完了. 如何验证呢? 其实python早就给你准备好

了. 我们可以使用类名.__mro__获取到类的MRO信息

print(H.__mro__)

结果:

(, , ,

‘__main__.D‘>, , , ,, )

3. super是什么?

super()可以帮我们执行MRO中下一个父类的方法. 通常super()有两个使用的地方:

可以访问父类的构造方法

当子类方法想调用父类(MRO)中的方法

方法一

class Foo: def __init__(self, a, b, c): self.a= a

self.b = b

self.c = c

class Bar(Foo): def __init__(self, a, b, c, d): super().__init__(a, b, c) # 访问父类的构造方法 self.d= d

b = Bar(1, 2, 3, 4)

print(b.__dict__)

结果:

{‘a‘: 1, ‘b‘: 2, ‘c‘: 3, ‘d‘: 4}

方法二

class Foo: def func1(self): super().func1() # 此时找的是MRO顺序中下?个类的func1()方法 print("我的家. 就住在这个屯") class Bar: def func1(self): print("你的家. 不在这个屯") class Ku(Foo, Bar): def func1(self): super().func1() # 此时super找的是Foo print("他的家. 不知道在哪个屯") k= Ku() # 先看MRO . KU, FOO, BAR object

k.func1()

k2 = Foo() # 此时的MRO. Foo object

k2.func1() # 报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerCenter Designer小结

使用PowerCenter Designer一个月,断断续续的记录一下中间遇到的问题: 1、lookup组件在写sql时,可以有查询条件,但是不能有排序(lookup有默认排序,根据表主键和out port) 需要更改默认排序时&…

Java加密与解密的艺术~安全协议~模型分析

模型分析 1、协商算法 RNC:Random Number Client RNS:Random Number Server 2、验证证书 3、产生密钥 PMS:Pre-Master Secret(预备主密钥) MS:Master Secret(主密钥) 4、加密交互

漫天风口,一地泡沫,消费机器人四年跌宕史

来源:OFweek 作者:邹大湿提及科技浪潮,AI 和机器人是逃不过的。2018年,AI依旧很火,但几年前曾经燥热的机器人狂潮,似乎凉凉了?那个曾经宣称万亿市场的智能机器人,究竟怎么了&#…

urlconnection java_java成神之——HttpURLConnection访问api

HttpURLConnection访问get资源HttpURLConnection connection (HttpURLConnection)new URL("http://ip/test").openConnection();int responseCode connection.getResponseCode();InputStream inputStream;if (200 < responseCode && responseCode < …

Python操作RabbitMQ

来源&#xff1a;http://www.cnblogs.com/phennry/p/5713274.html 本篇博客主要介绍如何通过Python来操作管理RabbitMQ消息队列&#xff0c;大家在工作中可能遇到很多类似RabbitMQ这种消息队列的中间件&#xff0c;如&#xff1a;ZeroMQ、ActiveMQ、MetaMQ等&#xff0c;我们学…

分享-利用VPC防止病毒软件的进入你的windows电脑

作为一个软件爱好者时不时都会从网上下载一些软件使用&#xff0c;虽然&#xff0c;现在防病毒和木马软件做得很好&#xff0c;但也架不住众多病毒木马的攻击。 所以&#xff0c;我的经验是当我下载一个软件以后&#xff0c;无法判定是否是病毒木马的话&#xff0c;我会安装在虚…

无监督学习最新研究:通过简单的「图像旋转」预测便可为图像特征学习提供强大监督信号

作者&#xff1a;Spyros Gidaris、Praveer Singh、Nikos Komodakis「雷克世界」编译&#xff1a;嗯~是阿童木呀、KABUDA、EVA在过去的几年中&#xff0c;深度卷积神经网络&#xff08;ConvNets&#xff09;已经改变了计算机视觉的领域&#xff0c;这是由于它们具有学习高级语义…

Java加密与解密的艺术~安全协议~单向认证服务

1、准备工作 A、域名绑定 在hosts文件末尾追加 127.0.0.1 www.zlex.org B、证书导入 浏览器导入自签名证书文件zlex.cer C、服务器配置 配置SSL/TLS 单向认证 <Connectorport"443"SSLEnabled"true"clientAuth"false"maxThreads"150…

java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

Java使用3DES加密解密的流程①传入共同约定的密钥(keyBytes)以及算法(Algorithm)&#xff0c;来构建SecretKey密钥对象SecretKey deskey new SecretKeySpec(keyBytes&#xff0c; Algorithm);②根据算法实例化Cipher对象。它负责加密/解密Cipher c1 Cipher.getInstance(Algor…

解决spring和struts配合问题

最近因为做weboa系统,我采用了strutsspringhibernate的整体架构,我按照目前网上流行的这方面的配置文件在web.xml中加入了: <param-name>contextconfiglocation</param-name> 【程序编程相关:struts中配置过滤文件&#xff01;】 <context-param> 【推荐阅…

Python 并行分布式框架 Celery

Celery 官网&#xff1a;http://www.celeryproject.org Celery 官方文档英文版&#xff1a;http://docs.celeryproject.org/en/latest/index.html Celery 官方文档中文版&#xff1a;http://docs.jinkan.org/docs/celery celery配置&#xff1a;http://docs.jinkan.org/docs/c…

java判断是否是路径_java判断是否是目录

java判断是否是目录&#xff1a;/*** 创建目录** param path*/public static void CreatFileDir(String path) {try {File file new File(path);if(file.getParentFile().isDirectory()){//判断上级目录是否是目录if(!file.exists()){ //如果文件目录不存在file.mkdirs(); //创…

中国数字化进程比发达国家快,小程序让我感到自豪 | IT领袖峰会

作者&#xff1a; 张驰2018年3月25日上午举办的第10届2018中国&#xff08;深圳&#xff09;IT领袖峰会上&#xff0c;腾讯公司董事会主席兼首席执行官发表了 “数字中国的机遇与探索” 主题演讲。在演讲中表示&#xff0c;不管什么产业都是需要科技来对它进行改造升级、转型。…

Java加密与解密的艺术~安全协议~双向认证服务

双向认证服务 1、准备工作 A、证书导入 导入ca.p12 导入client.p12 B、服务器配置 <Connectorport"443"SSLEnabled"true"clientAuth"true"maxThreads"150"protocol"HTTP/1.1"scheme"https"sec…

DataBinder.Eval的基本格式 效率 比较

<%#eval%>是单方向的资料连接 <%#bind%> 双方向的资料连接 <%#eval%>是只读的,你看到的那些无法更新数据的数据显示控件,可以用这个 <%#bind%> 不但可读,而且可写,那些可更新数据库的数据绑定控件,用这个 <%# DataBinder.Eval(Container.DataItem,&…

利用 Celery 构建 Web 服务的后台任务调度模块

来源&#xff1a;http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代&#xff0c;社交网站、搜索引擎的的迅猛发展对 Web 服务的后台管理系统提出了更高的需求。考虑几个常见的使用场景&#xff1a; 社交网站的用户在其主页发布了一组新…

java元素符号是什么_Java 代码中 @ 符号是什么意思?

展开全部annotation。Annotation&#xff0c;是Java5的新特性&#xff0c;下面是Sun的Tutorial的描述&#xff0c;因为是英文&#xff0c;这里我翻译下&#xff0c;希望能够比较清晰32313133353236313431303231363533e58685e5aeb931333264633435的描述一下Annotation的语法以及…

风景这边独好的AI大年,百度亚马逊等巨头第一季度成绩单怎么样?

苹果春季新品发布会邀请函来源&#xff1a;遇见人工智能该来的还是来了&#xff0c;但是那又如何&#xff1f;这句话是送给苹果的。本以为这个季度不会再有新品发布的苹果&#xff0c;却用一张主打“同学们&#xff0c;来次课外活动吧”的神奇邀请函打消了所有人的怀疑。根据从…

Java加密与解密的艺术~数字证书~证书使用openssl

证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_2;import java.io.FileInputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.cert.Certificate; i…

Run-time system与虚拟机

Run-time system与虚拟机 一个Run-time系统&#xff0c;由一个执行引擎&#xff08;Execution Engine&#xff09;、一个机器级的调试器&#xff08;Debugger&#xff09;、一个汇编器&#xff08;Assembler&#xff09;和与之配套的开发工具&#xff08;Tools&#xff09;组成…