werkzeug UpdateDictMixin解析

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。

你可能感兴趣的:(werkzeug UpdateDictMixin解析)