本文参考自《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全称是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()