Python高级笔记(四) -- 多继承_方法解析顺序表MRO
1. 多继承以及MRO顺序
1.1 单独调用父类的方法
# -*- encoding=utf-8 -*- class Parent(object):
def __init__(self, name):
print("parent的init开始被调用")
self.name = name
print("parent的init结束被调用") class Son1(Parent):
def __init__(self, name, age):
print('Son1的init开始被调用')
self.age = age
Parent.__init__(self, name)
print('Son1的init结束被调用') class Son2(Parent):
def __init__(self, name, gender):
print("Son2的init开始背调用")
self.gender = gender
Parent.__init__(self, name)
print("Son2的init结束被调用") class Grandson(Son1, Son2):
def __init__(self, name, age, gender):
print("Grandson的init开始被调用")
Son1.__init__(self, name, age)
Son2.__init__(self, name, gender)
print("Grandson的init结束被调用") s = Son1("douzi", 23)
s2 = Son2("douzi2", "男")
print("="*20)
s3 = Grandson("douzi3", 24, "男")
Son1的init开始被调用
parent的init开始被调用
parent的init结束被调用
Son1的init结束被调用
Son2的init开始背调用
parent的init开始被调用
parent的init结束被调用
Son2的init结束被调用
====================
Grandson的init开始被调用
Son1的init开始被调用
parent的init开始被调用
parent的init结束被调用
Son1的init结束被调用
Son2的init开始背调用-
parent的init开始被调用
parent的init结束被调用
Son2的init结束被调用
Grandson的init结束被调用
上述的操作及其费资源,比如网络编程时候,parent要创建一个socket,多个子类会创建多个socket,费资源。
1.2 C3算法,一套确定每个类只调用一次的算法(className.__mro__输出调用顺序)
所以,要把父类,改成super().__init__() ==> Parent只调用一次
class Parent(object):
def __init__(self, name, *args, **kwargs):
print("parent的init开始被调用")
self.name = name
print("parent的init结束被调用") class Son1(Parent):
def __init__(self, name, age, *args, **kwargs):
print('Son1的init开始被调用')
self.age = age
super().__init__(name, *args, **kwargs)
print('Son1的init结束被调用') class Son2(Parent):
def __init__(self, name, gender, *args, **kwargs):
print("Son2的init开始背调用")
self.gender = gender
super().__init__(self, name, *args, **kwargs)
print("Son2的init结束被调用") class Grandson(Son1, Son2):
def __init__(self, name, age, gender):
print("Grandson的init开始被调用")
super().__init__(name, age, gender)
print("Grandson的init结束被调用") s = Son1("douzi", 23)
s2 = Son2("douzi2", "男")
print("="*20)
s3 = Grandson("douzi3", 24, "男")
Son1的init开始被调用
parent的init开始被调用
parent的init结束被调用
Son1的init结束被调用
Son2的init开始背调用
parent的init开始被调用
parent的init结束被调用
Son2的init结束被调用
====================
Grandson的init开始被调用
Son1的init开始被调用
Son2的init开始背调用
parent的init开始被调用
parent的init结束被调用
Son2的init结束被调用
Son1的init结束被调用
Grandson的init结束被调用
MRO属性
super()默认拿着自己的类名到MRO输出中找,找到匹配项的下一个的__init__执行
print(Grandson.__mro__)
(<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)
1.3 为避免多继承报错,使用不定参数: *args, **kwargs
def test1(a, b, *args, **kwargs):
print(a)
print(b)
print(args)
print(kwargs) test2(a, b, args, kwargs)
print('-'*10)
test2(a, b, *args, **kwargs) # 相当于 test2(11,22,33,44,55, name="douzi", age=18) def test2(a, b, *args, **kwargs):
print('----------')
print(a)
print(b)
print(args)
print(kwargs) test1(11, 22, 33, 44, 55, name="douzi", age=18)

Python高级笔记(四) -- 多继承_方法解析顺序表MRO的更多相关文章
- sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO
sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...
- Python的程序结构[2] -> 类/Class[2] -> 方法解析顺序 MRO
方法解析顺序 / MRO (Method Resolution Order) 关于方法解析顺序(MRO)的详细内容可以参考文末链接,这里主要对 MRO 进行简要的总结说明以及一些练习示例. 经典类和新 ...
- 流畅的python读书笔记-第十章-继承优缺点
继承的优缺点 推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架.--Alan Kay 子类化内置类型很麻烦 (如 list 或 dict)) ,别搞这种 直接子类化内置类型(如 dict.li ...
- python 方法解析顺序 mro
一.概要: mor(Method Resolution Order),即方法解析顺序,是python中用于处理二义性问题的算法 二义性: 1.两个基类,A和B都定义了f()方法,c继承A和B那么C调用 ...
- Python的方法解析顺序(MRO)[转]
本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- Method Resolution Order – Python类的方法解析顺序
在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...
- Python中的MRO(方法解析顺序)[转载]
本文转载至: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...
- python高级(四)—— 文本和字节序列(编码问题)
本文主要内容 字符 字节 结构体和内存视图 字符和字节之间的转换——编解码器 BOM鬼符 标准化Unicode字符串 Unicode文本排序 python高级——目录 文中代码均放在github上: ...
- python面向对象-4类的继承与方法的重载
1.类的继承与方法的重载 上面就是先定义了一个类A,然后由定义了一个类B,B继承了类A,这样B就有了A的非私有属性和方法. class Washer: company='ZBL' def __init ...
随机推荐
- json-sever 配置与应用
先安装 node.js. 全局安装 json-server: npm install json-server -g 检查是否安装成功: json-server -h 安装好后,json-server的 ...
- spring笔记----看书笔记
上周末看了一章以前javaee轻量级的书spring部分,简单做了一些笔记 // ApplicationContext ac=new ClassPathXmlApplicationContext(&q ...
- 创建一个Windows服务程序与实现定时器效果
1.创建一个Windows服务程序 一. 新建Window服务项目 二. 添加安装程序 三. 配置服务属性 四. 编写定时器代码 publicpartialclassService1 ...
- windows压缩图片
- 面试7家,收到5个offer,我的Python就业经验总结 !
*---------------------------------------人生处处有惊喜,背后却是无尽的辛酸苦辣. Python找工作并不容易,老表面试了很多企业,总结了些宝贵经验! 一周转 ...
- Mysql 中的日期时间字符串查询
一.将数据库中的Date格式的数据,或者指定日期的字符串格式化为想要的样式 DATE_FORMAT (date, format)能根据格式串format 格式化日期或日期和时间值date,返回结果字符 ...
- Python百题计划
一.基础篇 想要像类似执行shell脚本一样执行Python脚本,需要在py文件开头加上什么?KEY:#!/usr/bin/env python Python解释器在加载 .py 文件中的代码时,会对 ...
- jdk自带的监测cpu/内存、线程等信息的工具
Jvisualvm:jdk自带的监控工具(JDK1.6+) 在终端中输入Jvisualvm回车出现如下界面:
- 重写Sink合并多行
flume1.6+elasticsearch6.3.2 Pom <dependencies> <dependency> <groupId>junit</gro ...
- Zookeeper+Kafka集群部署(转)
Zookeeper+Kafka集群部署 主机规划: 10.200.3.85 Kafka+ZooKeeper 10.200.3.86 Kafka+ZooKeeper 10.200.3.87 Kaf ...