zoukankan      html  css  js  c++  java
  • 设计模式,python延迟计算缓存模式

    之前已经发过单独的缓存,这也算一种模式。

    from __future__ import print_function
    import functools
    
    
    class lazy_property(object):
    
        def __init__(self, function):
            self.function = function
            functools.update_wrapper(self, function)
    
        def __get__(self, obj, type_):
            if obj is None:
                return self
            val = self.function(obj)
            obj.__dict__[self.function.__name__] = val
            return val
    
    
    def lazy_property2(fn):
        attr = '_lazy__' + fn.__name__
    
        @property
        def _lazy_property(self):
            if not hasattr(self, attr):
                setattr(self, attr, fn(self))
            return getattr(self, attr)
        return _lazy_property
    
    
    class Person(object):
    
        def __init__(self, name, occupation):
            self.name = name
            self.occupation = occupation
            self.call_count2 = 0
    
        @lazy_property
        def relatives(self):
            # Get all relatives, let's assume that it costs much time.
            relatives = "Many relatives."
            return relatives
    
        @lazy_property2
        def parents(self):
            self.call_count2 += 1
            return "Father and mother"
    
    
    def main():
        Jhon = Person('Jhon', 'Coder')
        print(u"Name: {0}    Occupation: {1}".format(Jhon.name, Jhon.occupation))
        print(u"Before we access `relatives`:")
        print(Jhon.__dict__)
        print(u"Jhon's relatives: {0}".format(Jhon.relatives))
        print(u"After we've accessed `relatives`:")
        print(Jhon.__dict__)
        print(Jhon.parents)
        print(Jhon.__dict__)
        print(Jhon.parents)
        print(Jhon.call_count2)
    
    
    if __name__ == '__main__':
        main()
    
    ### OUTPUT ###
    # Name: Jhon    Occupation: Coder
    # Before we access `relatives`:
    # {'call_count2': 0, 'name': 'Jhon', 'occupation': 'Coder'}
    # Jhon's relatives: Many relatives.
    # After we've accessed `relatives`:
    # {'relatives': 'Many relatives.', 'call_count2': 0, 'name': 'Jhon', 'occupation': 'Coder'}
    # Father and mother
    # {'_lazy__parents': 'Father and mother', 'relatives': 'Many relatives.', 'call_count2': 1, 'name': 'Jhon', 'occupation': 'Coder'}
    # Father and mother
    # 1
  • 相关阅读:
    谈谈JavaScript中继承方式
    《前端架构设计》学习笔记一--架构的种子
    正则中1的用法---反向引用
    JavaScript千分符---正则实现
    JavaScript开发中常用的代码规范配置文件
    前端开发流程---我们应该做些什么
    JavaScript中数据类型判断
    冒泡排序以及改进
    Number和toString中的坑
    Fluent Ribbon 第五步 ToolBar
  • 原文地址:https://www.cnblogs.com/ydf0509/p/9652917.html
Copyright © 2011-2022 走看看