类的缓存属性

时间:2015-06-10 08:12:24

标签: python properties

我喜欢 WritableWorkbook book = Workbook.getWorkbook(File file) ; 模块:https://pypi.python.org/pypi/cached-property

有没有办法为类获取缓存属性?

以下是"

的"属性的示例
cached_property

用法:

class Foo(object):
    @classmethod
    def get_bar(cls):
        return 'bar'

    @cached_class_property
    def bar(cls):
        return 'bar'

使用"缓存"我的意思是对属性的第二次(以及后来的)调用返回第一次调用的值。

1 个答案:

答案 0 :(得分:1)

属性只是描述符,当我们定义描述符时,总是会查找对象的类型。例如,将在其类中查找描述符,类似地,对于类,将查找其类型,即Metaclass。

import random


class cached_class_property(object):
    def __init__(self, func):
        self.func = func
        self.name = '_' + func.__name__

    def __get__(self, obj, type):
        if obj is None:
            return self
        sentinel = object()
        value = getattr(obj, self.name, sentinel)
        if value is sentinel:
            value = self.func(obj)
            setattr(obj, self.name, value)
        return value


class Meta(type):

    @cached_class_property
    def bar(cls):
        value = random.random()
        return value


class Foo(object):
    __metaclass__ = Meta

<强>演示:

>>> %run so.py
>>> Foo.bar
0.3896508798298206
>>> Foo.bar
0.3896508798298206
>>> Foo.bar
0.3896508798298206
>>> class Bar(Foo):
...     pass
...
>>> Bar.bar
0.3896508798298206
>>> Bar.bar
0.3896508798298206