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

【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()

你可能感兴趣的:(Python)