day021 MRO和c3算法

本文深入探讨Python中的继承机制,包括单继承、多继承及其应用场景。特别关注新式类的MRO(方法解析顺序)及C3算法,阐述如何通过super函数访问父类方法,提供实例帮助理解。

. python的继承. 多继承

        子类继承父类.

        为什么要继承? 为了节省开发时间. 调高开发效率. 代码得到了重用

        在python中存在多继承

        MRO(method resolution Order) 方法路径顺序.

            python2

                1. 使用经典类(写继承关系的时候. 基类不继承object)

                2. 新式类(继承关系的根. 是object)

            python3

                只有新式类

 

    二. 经典类的MRO

        经典类的MRO使用的是深度优先遍历

    三. 新式类的MRO, C3(重点, 难点)

        新式类中摒弃了(部分)旧的深度优先算法. 使用C3算法

        如果你的继承关系中没有菱形继承( 深度优先就够了)

        如果有菱形: 使用C3算法来计算MRO

        假设C3算法. L(x) 表示 x的继承关系

        先拆分。 拆到你能看出结果为止. 反着进行merge()运算

            合并 - 归并

            merge(元组, 元组, 元组,。。。。。。。)

            摘头。

        头和尾在比对,如果下一个尾没有这个头, 头就出现.  如果头在后面的尾出现. 跳过该元组. 继续下一个头. 直到最后一个元组. 根自己匹配

    四. super是神马玩意

        super可以访问MRO列表中的下一个类中的内容. 找父类

# MRO + super ⾯试题
class Init(object):
def __init__(self, v):
print("init")
self.val = v
class Add2(Init):
def __init__(self, val):
print("Add2")
super(Add2, self).__init__(val)
print(self.val) # 5
self.val += 2 # 7
class Mult(Init):
def __init__(self, val):
print("Mult")
super(Mult, self).__init__(val)
self.val *= 5
class HaHa(Init):
def __init__(self, val):
print("哈哈")
super(HaHa, self).__init__(val)
self.val /= 5
class Pro(Add2,Mult,HaHa): #
pass
class Incr(Pro):
def __init__(self, val):
super(Incr, self).__init__(val)
self.val += 1

print(Incr.__mro__)

# p = Incr(5) # MRO: Incr Pro Add2 Mult HaHa Init
# # 一个对象. p : val: 8
# print(p.val)
c = Add2(2) # MRO: ADD2 INIT
print(c.val)

转载于:https://www.cnblogs.com/litieshuai/p/9757267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值