python中类的演变

python类的发展史

  • 经典类(python2.2以前):是一种没有继承的类,对象类型都是type类型,如果经典类被作为父类,子类调用父类的构造函数时会出错
# 1
import inspect
class D:
    pass
class E:
    pass
class B(D):
    pass
class C(E):
    pass
class A(B, C):
    pass
print(inspect.getmro(A))    #(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)



# 2
import inspect
class D:
    pass
class C(D):
    pass
class B(D):
    pass
class A(B, C):
    pass
print(inspect.getmro(A))    #(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)
  • 新式类(python2.2):为了类和内置的类型更加统一,引入新式类。新式类的每个类都继承于一个基类,可以是自定义的类或者其他类,默认是object,子类可以调用父类中的构造函数
# 1
class D:
    pass
class E:
    pass
class B(D):
    pass
class C(E):
    pass
class A(B, C):
    pass


# 2
class D:
    pass
class C(D):
    pass
class B(D):
    pass
class A(B, C):
    pass

'''
第一种:看起来正常,单实际上感觉到别扭,比如B继承D的f()方法,恰巧C中页实现了f()方法,在A中调用f()函数会选择使用C的,这种应该先从B和B的父类开始查找才是正确的顺序,称为单调性
第二种:菱形模式下BFS解决了DFS查找的顺问题,但是他也违背了单调性

'''
  • python2.3-2.7
    在这之前BFS算法存在很大的问题,从2.3开始新式类的MRO算法开始使用C3算法,C3算法解决了单调性问和之能继承无法重写的问题
  • 新式类一统江山(python3至今)
    C3算法解决的问题
    1、单调性问题
    2、不能重写的问题
    拓扑排序:
    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序
    抽象模拟:
    首先找入读为0的点,只有一个A,把A拿出来,把A相关的边裁剪掉,在找到入读点为0的点,有两个(B、C),根据最左侧原则拿B,此时的顺序为AB,裁剪B相关的边。此时入读点为0的有D和C,取最左侧的D,此时的顺序为ABD。此时只有一个入读点为0的点C,裁剪掉C的边,此时的顺序为ABDC。剩下入读点为0的只有E,裁剪E相关的边,此时的顺序为ABDCE。最后一个入读点为0的是object,再去掉object的边,此时顺序为ABDCEobject
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值