【Python学习日记】子类化内置方法和MRO

本文探讨了Python中子类化内置类的技巧,通过实例展示如何创建一个只允许特定键的字典类。同时深入解析了方法解析顺序(MRO),解释其在多重继承中的作用,并对比了Python2与Python3的MRO差异。
摘要由CSDN通过智能技术生成

【Python学习日记】子类化内置类和MRO

本文参考自《python高级编程》第二版第三章

子类化内置类

子类化内置类是简单高效实现内置类相似行为类型的方法,在编写新类之前,都可以考虑一下是否能够子类化内置类,书中给出了一个无法修改已存在键的字典,这里写一个只能有固定键的字典

class NoSuchKeyError(ValueError):
    ...


class FixDict(dict):
    fix_key = ['name', 'age', 'height']

    def __setitem__(self, key, value):
        if key not in self.fix_key:
            raise NoSuchKeyError('key {} is not in fixed key {}'.format(key, self.fix_key))
        else:
            super().__setitem__(key, value)

FixDict子类化了内置方法dict,只能有固定的三个键name、age和height,设置其他键都会引发NoSuchKeyError,键合法时则调用父类方法设置

MRO

MRO全称是method resolution order,即方法解析顺序,书中给出了在复杂继承关系下python3的MRO

class CommonBase:
    def method(self):
        print('Common base')

class Base1(CommonBase):
    def method(self):
        print('Base1')

class Base2(CommonBase):
    def method(self):
        print('Base2')

class MyClass(Base1,Base2):
    ...


if __name__ == '__main__':
    mc = MyClass()
    mc.method()
    print(MyClass.mro())

这是一个菱形的继承,最终输出为

Base1
[<class '__main__.MyClass'>, <class '__main__.Base1'>, <class '__main__.Base2'>, <class '__main__.CommonBase'>, <class 'object'>]

当我们创建新类后,类的mro方法给出了方法解析顺序,在我们调用method方法后,类会按照这个解析顺序来寻找method方法,将找到的第一个method方法作为结果,因为MyClass没有method,所以调用的是mrc列表中最靠前且有method方法的Base1.method(),python3中mro构建序列的方式就是,先对每个父类进行地柜深度查找得到一个列表序列,然后如果某个类包含在多个列表中,就会利用层次结构消歧

python2和python3的mro不同,在多重继承时,python2会使用从左到右、深度优先的方式来寻找method方法,此时找到的就会是CommanBase.method()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>