werkzeug UpdateDictMixin解析
class UpdateDictMixin(object):
"""Makes dicts call `self.on_update` on modifications.
.. versionadded:: 0.5
:private:
"""
on_update = None
def calls_update(name):
def oncall(self, *args, **kw):
rv = getattr(super(UpdateDictMixin, self), name)(*args, **kw)
if self.on_update is not None:
self.on_update(self)
return rv
oncall.__name__ = name
return oncall
def setdefault(self, key, default=None):
modified = key not in self
rv = super(UpdateDictMixin, self).setdefault(key, default)
if modified and self.on_update is not None:
self.on_update(self)
return rv
def pop(self, key, default=_missing):
modified = key in self
if default is _missing:
rv = super(UpdateDictMixin, self).pop(key)
else:
rv = super(UpdateDictMixin, self).pop(key, default)
if modified and self.on_update is not None:
self.on_update(self)
return rv
__setitem__ = calls_update('__setitem__')
__delitem__ = calls_update('__delitem__')
clear = calls_update('clear')
popitem = calls_update('popitem')
update = calls_update('update')
del calls_update
zerkzeug中自定义实现了许多数据结构,其中UpdateDictMixin是大部分数据结构的父类。calls_update函数类似于装饰器,通过此函数,可以访问父类的其他方法。可是,UpdateDictMixin的父类是object,并没有其他方法。这里主要涉及py的多继承。众所周知,py支持多继承,可以同时继承多个父类。而且不同的父类,只需要通过super语法,就可以访问另一个被继承的父类。
在zerkzeug中,大部分的数据结构都实现类似于dict和list的结合,可以通过calls_update来直接调用其他父类的相应的方法。在使用的时候,只需要继承UpdateDictMixin,list。