美文网首页
werkzeug UpdateDictMixin解析

werkzeug UpdateDictMixin解析

作者: 烤土豆啦 | 来源:发表于2018-07-25 15:25 被阅读0次

    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解析

          本文链接:https://www.haomeiwen.com/subject/bwwpmftx.html