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的更多相关文章

  1. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  2. Python的程序结构[2] -> 类/Class[2] -> 方法解析顺序 MRO

    方法解析顺序 / MRO (Method Resolution Order) 关于方法解析顺序(MRO)的详细内容可以参考文末链接,这里主要对 MRO 进行简要的总结说明以及一些练习示例. 经典类和新 ...

  3. 流畅的python读书笔记-第十章-继承优缺点

    继承的优缺点 推出继承的初衷是让新手顺利使用只有专家才能设计出来的框架.--Alan Kay 子类化内置类型很麻烦 (如 list 或 dict)) ,别搞这种 直接子类化内置类型(如 dict.li ...

  4. python 方法解析顺序 mro

    一.概要: mor(Method Resolution Order),即方法解析顺序,是python中用于处理二义性问题的算法 二义性: 1.两个基类,A和B都定义了f()方法,c继承A和B那么C调用 ...

  5. Python的方法解析顺序(MRO)[转]

    本文转载自: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...

  6. Method Resolution Order – Python类的方法解析顺序

    在支持多重继承的编程语言中,查找方法具体来自那个类时的基类搜索顺序通常被称为方法解析顺序(Method Resolution Order),简称MRO.(Python中查找其它属性也遵循同一规则.)对 ...

  7. Python中的MRO(方法解析顺序)[转载]

    本文转载至: http://hanjianwei.com/2013/07/25/python-mro/ 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就 ...

  8. python高级(四)—— 文本和字节序列(编码问题)

    本文主要内容 字符 字节 结构体和内存视图 字符和字节之间的转换——编解码器 BOM鬼符  标准化Unicode字符串 Unicode文本排序 python高级——目录 文中代码均放在github上: ...

  9. python面向对象-4类的继承与方法的重载

    1.类的继承与方法的重载 上面就是先定义了一个类A,然后由定义了一个类B,B继承了类A,这样B就有了A的非私有属性和方法. class Washer: company='ZBL' def __init ...

随机推荐

  1. 无限极分类(adjacency list)的三种方式(迭代、递归、引用)

    一般的分类树状结构有两种方式: 一种是adjacency list,也就是是id,parent id这中形式. 另一种是nested set,即左右值的形式. 左右值形式查询起来比较高效,无需递归等, ...

  2. C语言货架01

    教材: < C程序设计(第四版) >  谭浩强著    清华大学出版社 教材目录 第1章     程序设计和C语言 第2章     算法——程序的灵魂 第3章     最简单的C程序设计— ...

  3. 从0开始的Python学习011模块

    简介 你已经学习了如何在你的程序中定义一次函数而重用代码.如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块.模块基本上就是一个包含了所有你定义的函数和变量的 ...

  4. background问题

    1.如果是小图的背景图 background: url("@{images-dir}/homepage/our_pro_2x.png") no-repeat 0 0; backgr ...

  5. 最新:百度春节抢百万游戏--汤圆向前冲--辅助工具v1.0.0.2

    https://www.cnblogs.com/Charltsing/p/ADBJumpTY.html 联系QQ:564955427 本程序为Windows版,不要在手机里面打开. 汤圆向前冲辅助工具 ...

  6. C#中的PropertyGrid绑定对象,通过改变某一值而动态设置部分属性的特性

    问题:如下,我定义了一个对象,默认设置属性WindowSize ,WindowSize 为不可见,通过改变SaveOnClose的值,动态的改变不可见的属性的显示和隐藏. [DefaultProper ...

  7. windows一键安装包的升级禅道

    如果你现在使用的是windows xampp 集成运行环境,那么请按照下面的步骤进行: 一.升级步骤: 下载新的源代码包(zip格式).(注意,不是.exe的集成运行环境,如果你下载这个,会造成数据被 ...

  8. AOP - 1 基本概念

    1.AOP (面向切面编程) AOP,Aspect Oriented Programming,意为:面向切面编程, 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术, AOP是OOP的 ...

  9. Alan Turing的纪录片观后感

    清明假期,火车上闲着,上B站看了图灵的纪录片 好吧,感想就两个词,数字化 和 自动化

  10. JDK源代码学习-基础类

    一.概述 1.Java,是一套语言规范,例如规定了变量如何定义.控制语句如何写等,提供基本的语法规范.JDK是java自带的一套调用组件,是对基本java语法规范的进一步封装,jdk中都是使用java ...