mro

python MRO:C3算法

↘锁芯ラ 提交于 2021-02-11 18:37:11
在 python 2.2 之后,python 实现了一个新的MRO算法:C3算法,用于方法解析顺序 。 一、什么是方法解析顺序 方法解析顺序 :多重继承时,用于在子类中调用父类方法时确定调用哪个父类的方法 。 多重继承代码示例: #!/usr/bin/python #-*- coding:utf8 -*- class A(object): def echo(self): print "class_A" class B(A): pass #def echo(self): # print "class_B" class C(A): def echo(self): print "class_C" class D(B,C): pass print D.__mro__ //python使用__mro__ 来存储线性化计算的结果。 ubuntu@yee:/tmp$ python mro.py (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>) 可以看到顺序为: D --> B --> C --> A --> object 当子类D调用echo方法时: D().echo() python 先搜索 D 本地类,再搜索B,有则返回

PYTHON解析XML的多种方式效率对比实测

一笑奈何 提交于 2020-03-21 04:01:48
在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受。 在网络搜索后发现,目前应用比较广泛,且效率相对较高的ElementTree也是一个比较多人推荐的算法,于是拿这个算法来实测对比,ElementTree也包括两种实现,一个是普通ElementTree(ET),一个是ElementTree.iterparse(ET_iter)。 本文将对DOM、SAX、ET、ET_iter四种方式进行横向对比,通过处理相同文件比较各个算法的用时来评估其效率。 程序中将四种解析方法均写为函数,在主程序中分别调用,来评估其解析效率。 解压后的XML文件内容示例如下,我自己的需求是解析其中第一个 measurement内容,其他的内容丢弃。eNB的属性以及object的属性都需要解析并和v字段的文本一起写入csv文件。 <?xml version="1.0" encoding="UTF-8"?> <bulkPmMrDataFile> <fileHeader fileFormatVersion="V1.0.4" reportTime="2016-02-22T21:00:00.000" ></fileHeader> <eNB id="122941"> <measurement> <smr>MR.LteScRSRP

python3 mro

十年热恋 提交于 2020-03-09 10:58:13
我们知道, Python 类是支持(多)继承的,一个类的方法和属性可能定义在当前类,也可能定义在基类。针对这种情况,当调用类方法或类属性时,就需要对当前类以及它的基类进行搜索,以确定方法或属性的位置,而搜索的顺序就称为方法解析顺序。 方法解析顺序(Method Resolution Order),简称 MRO。对于只支持单继承的编程语言来说,MRO 很简单,就是从当前类开始,逐个搜索它的父类;而对于 Python,它支持多继承,MRO 相对会复杂一些。 实际上,Python 发展至今,经历了以下 3 种 MRO 算法,分别是: 从左往右,采用深度优先搜索(DFS)的算法,称为旧式类的 MRO; 自 Python 2.2 版本开始,新式类在采用深度优先搜索算法的基础上,对其做了优化; 自 Python 2.3 版本,对新式类采用了 C3 算法。由于 Python 3.x 仅支持新式类,所以该版本只使用 C3 算法。 有关旧式类和新式类的讲解,可阅读《 Python super()使用注意事项 》一文。 有读者可能会好奇,为什么 MRO 弃用了前两种算法,而选择最终的 C3 算法呢?原因很简单,前 2 种算法都存在一定的问题。 旧式类MRO算法 在使用旧式类的 MRO 算法时,以下面代码为例(程序一): class A : def method (self ): print (

How to know MRO in python2

送分小仙女□ 提交于 2020-02-01 12:49:40
In python3, we can use '__mro__' to get the method-resolution-order like below: >>> class a: ... pass ... >>> a.__mro__ (<class '__main__.a'>, <class 'object'>) >>> Does python2 has an alternative method for this? I tried to find one but failed. >>> class a: ... pass ... >>> dir(a) ['__doc__', '__module__'] >>> class a(object): ... pass ... >>> dir(a) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_

Python中方法搜索顺序——MRO

大兔子大兔子 提交于 2020-01-30 00:08:50
Python中针对类提供了一个内置函数__mro__可以查看方法搜索顺序 mro顺序: Method Resolution Order 多继承在python解释器中时怎样调用它的各个父类方法呢?在python类中,有一个内置方法__mro__,它返回一个元祖,保存父类的调用顺序,能够保证每个父类都会被调用,而且只被调用一次 主要用于在多继承时判断方法和属性的调用路径 使用格式: print(对象. mro ) 输出:(<calss ‘ main .类A’>,<calss ‘ main .类B’>,<calss ‘ main .类C’>) Python的解释器会按照mro指定的方法搜素顺序来在各个类中查找对应的方法。以上类A,类B,类C已经按照mro的顺序排列好,所以Python解释器首先会在类A中查找需要的方法,如果没有找到会依次从左往右在继续在类B和类C中查找需要的方法,如果都没有查到,就会报错。 欢迎交流,我们一起进步! 来源: CSDN 作者: PythonWithCar 链接: https://blog.csdn.net/qq_36510630/article/details/104110309

面向对象

自闭症网瘾萝莉.ら 提交于 2020-01-26 18:18:38
第六章 面向对象 规范化目录 规范化目录的优点 #1:加载速度块#2:可读性高#3:查询修改代码时都简单​ 规范化目录分析 划归固定的路径 将文件目录的固定路径划分完成​ settings.py配置文件 #1:基本存储的都是变量#2:静态路径,数据库的链接,配置,静态文件的的路径,基本不发生改变的​ src.py主逻辑函数 #主逻辑函数,核心函数:贯穿整个项目的主要功能​ common.py公共组件 #放置一些公用的函数,功能,方便与其他的函数或者业务需求,如:装饰器​ start启动文件 #单独的启动文件,将所有项目的功能单独放置一个文件中,开启项目方便,醒目​ register #用户信息,数据相关,多个文件​ logging日志文件 #记录用户的访问次数,转账,取钱,充钱等等.极了用户干了什么.​ README描述文件 #1:软件定位,软件的基本功能。#2:运行代码的方法: 安装环境、启动命令等。#3:简要的使用说明。#4:代码目录结构说明,更详细点可以说明软件的基本原理。#5:常见问题说明。​ 规范化目录sys模块路径加载 #版本一sys模块内置模块,文件运行时,sys内置模块就会将一些模块 自动 加载到内存. 内置模块. time,json pickle等等.以及当前目录的.如何引用到一个模块最本质的原因在于这个模块名称空间在不在内存.如果直接引用不到一个模块

继承

风流意气都作罢 提交于 2020-01-26 11:14:38
今日内容大纲 初识继承 字面意思:儿子完全可以使用父类的所有内容 专业角度: 如果 B类继承 A类,B 类就称为子类,派生类 A类就称为父类,基类,超类 面向对象的三大特性之一:继承,封装,多态 2.继承的优点 1.减少代码的重复性 2.增加类之间的耦合性 3.代码更加清晰,流畅 3.单继承 1.类名执行父类属性方法 2.对象执行父类属性方法 3.在子类中既执行子类方法又执行父类方法 class Animal: # # def __init__(self, name, sex, age): # # self.name = name # self.age = age # self.sex = sex # # # class Human(Animal): # pass # class Dog(Animal): # pass # # # class Cat(Animal): # pass # class Cat(object): # pass cat1 = Cat() # Human,Dog,Cat 子类,派生类. # Animal 父类,基类,超类. # person = Human('李业', '男', 18) # print(person.name) 4.多继承 1.经典类:不继承 object 类,深度优先原则 2.新式类:继承 object 类.mro(c3)算法 class

day23——继承

醉酒当歌 提交于 2020-01-25 09:39:01
day23 初识继承 字面意思:儿子可以完全使用父亲的所有内容 专业角度:如果B类继承A类, B类就称为子类、派生类 A类就称为父类、基类、超类 面向对象三大特性:继承、封装、多态 继承:单继承、多继承 # class Human: # def __init__(self, name, sex, age): # self.name = name # self.age = age # self.sex = sex # # # class Dog: # def __init__(self, name, sex, age): # self.name = name # self.age = age # self.sex = sex # # # class Cat: # def __init__(self, name, sex, age): # self.name = name # self.age = age # self.sex = sex 继承 class Animal: def __init__(self, name, sex, age): self.name = name self.age = age self.sex = sex class Human(Animal): pass class Dog(Animal): pass class Cat(Animal): pass #

Python 入门 16 —— 类的多态、 MRO列表、 super()函数

守給你的承諾、 提交于 2020-01-25 04:59:28
一、多态 当多个子类继承同一个父类时,在各个子类中都可以重载父类的成员。通过各自的重载,父类的某一成员在不同的子类中就会有不同的“表现”,这种现象就叫“多态”。例如: class b01 : x = 0 class cls01 ( b01 ) : x = 11 class cls02 ( b01 ) : x = 22 class cls03 ( b01 ) : x = 33 class cls04 ( b01 ) : x = 44 class cls05 ( b01 ) : x = 55 print ( cls01 . x , cls02 . x , cls03 . x , cls04 . x , cls05 . x ) # 11 22 33 44 55 以上例子中基类中定义的变量 x,当用不同的子类中,其值各不相同,这就是典型的“多态”现象。不过,以上例子展示的是最简单的多态形式。在实际的子类重载父类成员的过程上,通常都会引用父类的成员,即,父类已有的功能不再重复实现。 在派生类中引用基类成员可以有两种方法:一是用“基类名.成员名”的方法;二是用“super().成员名”的方法。用“基类名.成员名”的方法虽然简单明了,但潜在一个问题:当基类名发生改变时,子类就必须同时进行修改————逐一地在引用基类成员的地方将旧的基类名修改为新的基类名。而用“super().成员名

Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)

帅比萌擦擦* 提交于 2019-12-24 20:22:20
在面向对象的中,类与类之间存在三种关系:依赖关系、组合关系、继承关系。 1、依赖关系:将一个类的类名或对象当做参数传递给另一个函数被使用的关系就是依赖关系 class People: def __init__(self,name): self.name = name def open(self,bx): bx.open_door(self) def close(self,bx): bx.close_door(self) class Refrigerator: def __init__(self,name): self.name = name def open_door(self,p): print(f"{p.name} 打开冰箱") def close_door(self,p): print(f"{p.name} 关闭冰箱") r = People("大魔") # People类实例化一个对象r aux = Refrigerator("奥克斯") # Refrigerator类实例化一个对象aux r.open(aux) # 将aux对象当做参数传递给r对象的open方法使用 r.close(aux) # 将aux对象当做参数传递给r对象的close方法使用 推荐Python大牛在线分享技术 扣qun:855408893 领域:web开发,爬虫,数据分析,数据挖掘,人工智能