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中自定義實(shí)現(xiàn)了許多數(shù)據(jù)結(jié)構(gòu)扎狱,其中UpdateDictMixin是大部分?jǐn)?shù)據(jù)結(jié)構(gòu)的父類棚放。calls_update函數(shù)類似于裝飾器莹桅,通過此函數(shù)坠敷,可以訪問父類的其他方法奈梳∩豪蓿可是圣勒,UpdateDictMixin的父類是object,并沒有其他方法未玻。這里主要涉及py的多繼承灾而。眾所周知,py支持多繼承扳剿,可以同時(shí)繼承多個(gè)父類旁趟。而且不同的父類,只需要通過super語法庇绽,就可以訪問另一個(gè)被繼承的父類锡搜。
在zerkzeug中,大部分的數(shù)據(jù)結(jié)構(gòu)都實(shí)現(xiàn)類似于dict和list的結(jié)合瞧掺,可以通過calls_update來直接調(diào)用其他父類的相應(yīng)的方法耕餐。在使用的時(shí)候,只需要繼承UpdateDictMixin,list辟狈。