求分析缓存装饰器的执行思路及流程是什么,思路流程,2017/2/6描述比如
求分析缓存装饰器的执行思路及流程是什么,思路流程,2017/2/6描述比如
2017/2/6
描述
比如, 考虑这样一段代码, 它的执行流程是怎样的呢 ?
class Foo(object): @cached_property def foo(self): # calculate something important here return 42 f = Foo()f.foof.foo
相关代码
以class为基础的缓存装饰器
class cached_property(property): """A decorator that converts a function into a lazy property. The function wrapped is called the first time to retrieve the result and then that calculated result is used the next time you access the value:: class Foo(object): @cached_property def foo(self): # calculate something important here return 42 The class has to have a `__dict__` in order for this property to work. """ # implementation detail: A subclass of python's builtin property # decorator, we override __get__ to check for a cached value. If one # choses to invoke __get__ by hand the property will still work as # expected because the lookup logic is replicated in __get__ for # manual invocation. def __init__(self, func, name=None, doc=None): self.__name__ = name or func.__name__ self.__module__ = func.__module__ self.__doc__ = doc or func.__doc__ self.func = func def __set__(self, obj, value): obj.__dict__[self.__name__] = value def __get__(self, obj, type=None): if obj is None: return self value = obj.__dict__.get(self.__name__, _missing) if value is _missing: value = self.func(obj) obj.__dict__[self.__name__] = value return value
上下文环境
产品版本: Python2
操作系统: Linux
搜索
相似的问题: http://stackoverflow.com/ques...
cached_property 是 property 的subclass, 复写了 __get__, __set__ 方法.
cached_property 是一个描述器(资料描述器),获取属性的时候优先从描述器获取,即(__get__).
所以执行流程就是:
f.foo -> __get__ -> 从实例字典(f.__dict__)获取 -> 如果没有则保存到字典并调用实际方法返回
def cached_property(func): def _deco(*args, **kwargs): print(22222222222222) ret = func(*args, **kwargs) #这是调用foo方法 print(44444444444444) return ret return _decoclass Foo(object): def __init__(self): print (111111111111111111) @cached_property def foo(self): print(3333333333333) return 42f = Foo()f.foo()
编橙之家文章,
相关内容
- Python REPL通俗的理解什么?,pythonrepl,“读取-求值-输出
- 请问在windows下安装pip如何操作,windowspip,已经安装好
- 用python方法来做oracle数据库链接的原理是什么?,pyt
- Python中is和==有什么区别?,pythonis,if foo is No
- Flask中的URL部分什么方法可以让它支持正则,FlaskURL方法
- Python这种修改了传入对象的函数, 是否应该用deepcopy, 另
- Python web开发难不难需要了解哪些知道点,python难不难
- Python .pyc文件如何从源码文件夹中剥离出来,,比如,我
- Python求两个数之间所有的素数求思路,python素数,题目要
- Python XML禁止转义设置方式是怎样的,python转义,使用P
评论关闭