惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
J
Java Code Geeks
U
Unit 42
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
D
Docker
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
I
InfoQ
The Cloudflare Blog
小众软件
小众软件
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
S
SegmentFault 最新的问题
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
V
V2EX
月光博客
月光博客
Martin Fowler
Martin Fowler

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
多继承广度|深度优先,C3算法,继承顺序__mro__-互联网IT百科
2020-08-01 · via 老董笔记

  一个类可能有多个父类,这个就涉及多继承。

  每个父类可能还有自己的父类,这一群父类之间可能有同名方法,总而言之,可能会出现非常混乱的继承局面。所以多继承就涉及到继承顺序(即MRO顺序:method resolution order)问题。(PS:多继承容易让代码逻辑复杂、思路混乱,难以维护,一些语言如Java、C#、PHP 等已经取消了多继承。在实际开发中正常的人类也不会刻意去写多继承。)

  python3中多继承并不是严格按照广度优先(按照参数从左到右)或者深度优先(先把左边参数从下到上查找完)这种单一的方式去查找,而是有一个多继承的C3算法存在。

  1)看一个深度优先的案例

  测试了很多次,这种简单的多继承,c3算出来的结果跟深度优先效果一样。

# -*- coding:utf-8 -*-

class SheDiao:
    def say(self):
        print('射雕英雄...')


class ShenDiao(SheDiao):
    pass


class SanGuo:
    def sqy(self):
        print('阉人张飞在此')


class YiTan(SheDiao):
    def say(self):
        print('倚天屠龙')


class XiYou:
    def say(self):
        print('孙行者...')


class Person1(ShenDiao,SanGuo):
    pass


class Person2(YiTan,XiYou):
    def say(self):
        print('超级人2')


class Man(Person1,Person2):
    pass

if  __name__ == "__main__":
    f1 = Man()
    f1.say()
    print(Man.__mro__)
超级人2
(<class '__main__.Man'>, <class '__main__.Person1'>, <class '__main__.ShenDiao'>, <class '__main__.Person2'>, <class '__main__.YiTan'>, <class '__main__.SheDiao'>, <class '__main__.SanGuo'>, <class '__main__.XiYou'>, <class 'object'>)

  2)看一个广度优先的案例

  不好意思,我暂时没有测试出来案例。

  3)看1个看不出顺序的案例,C3算法的体会

  要获得继承顺序,可以用用内置属性__mro__,其实MRO顺序是一个有序列表,在类被创建时就计算出来了。

# -*- coding:utf-8 -*-


class SheDiao():
  def say(self):
    print('射雕大侠...')


class ShenDiao(SheDiao):

  def skill(self):
    print(f'{self.name}技能黯然销魂掌')


class ShuiHu():

  def skill(self):
    print(f'{self.name}技能回马枪..')

  def say(self):
    print('打虎好汉在此...')


class SuperMan(ShenDiao,ShuiHu):
  def __init__(self, name):
    self.name = name


if  __name__ == "__main__":
  p = SuperMan('老董')
  p.skill()
  p.say()
  print(SuperMan.__mro__)
老董技能黯然销魂掌
射雕大侠...
(<class '__main__.SuperMan'>, <class '__main__.ShenDiao'>, <class '__main__.SheDiao'>, <class '__main__.ShuiHu'>, <class 'object'>)

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会