python中的计算静态属性

Posted

技术标签:

【中文标题】python中的计算静态属性【英文标题】:Computed static property in python 【发布时间】:2017-01-22 18:12:32 【问题描述】:

是否可以在一个类上拥有一个静态属性,该属性将被计算为一次性。我们的想法是能够这样做:

class Foo:
    static_prop = Foo.one_off_static_method()

    @staticmethod
    def one_off_static_method():
        return 'bar'

我也想过用__new__

Class Foo:
    def __new__(cls):
         cls.static_prop = ... do everything here

但不确定这意味着什么。

【问题讨论】:

你想要这个懒惰的评估吗(它实际上是否足够昂贵并且有足够的可能永远不会被使用,所以懒惰的评估是有意义的)? 您是否尝试将静态方法设为属性? 您希望在首次使用时还是在类定义时计算它? 这是我用的:***.com/a/6849299/107660 @user2357112 这很昂贵,打开读取文件并创建数据结构。 【参考方案1】:

在真正创建类之前,one_off_static_method 只是一个常规函数。它需要在您尝试调用它之前定义,因为您想在执行class 语句时调用它。完成后,您只需将其删除即可。

class Foo:
    def _one_off_static_method():
        return 'bar'

    static_prop = _one_off_static_method()
    del _one_off_static_method

【讨论】:

【参考方案2】:

如果您希望在类定义时计算它,请参阅chepner's answer - 尽管我建议只使用模块级函数。

如果您希望对其进行惰性评估,那么您可能对cached_property 感兴趣。

>>> from random import random
>>> from cached_property import cached_property
>>> class Foo(object):
...     @cached_property
...     def one_off_thing(self):
...         print('computing...')
...         return random()
...     
>>> foo = Foo()
>>> foo.one_off_thing
computing...
0.5804382038855782
>>> foo.one_off_thing
0.5804382038855782

注意: 似乎每个人和他的狗都在 Python 中实现了备忘录装饰器,这是其中之一。如果您使用的是 Python 3,请考虑使用 functools.lru_cache,因为它位于核心库中。

【讨论】:

这将在每个实例中计算一次,对吧? 是的,每个实例一次。 很高兴找到functools.lru_cache【参考方案3】:

给你,我给你做了一个小描述符:-)

在访问属性时,它会被计算和缓存。

class CachedStaticProperty:
    """Works like @property and @staticmethod combined"""

    def __init__(self, func):
        self.func = func

    def __get__(self, inst, owner):
        result = self.func()
        setattr(owner, self.func.__name__, result)
        return result

它的工作方式相当简单:

    使用装饰器语法后,我在内部保存函数。 访问时,我调用该函数并将值设置为与原始函数同名的类值。

仅此而已。简单高效。

【讨论】:

@mkohram 哎呀,给你 :-) 它更小:P @mkohram 添加了一个小解释。【参考方案4】:

从 Python 3.8 开始,Python 内置/核心 functools 库中将包含一个 cached_property 装饰器。

https://docs.python.org/dev/library/functools.html?highlight=s#functools.cached_property

本网站上的其他问题也有类似的答案。一些亮点是可以做到的

@property
@functools.lru_cache(1)

(两个 Python 内置函数)以获得类似的效果。并且一些 Web 服务器库(例如 Flask 或 Werkzeug)已经包含了它们自己的 cached_property 装饰器实现。

当然还有其他方法(如该问题的其他答案和其他问题的答案中所述)可以创建自己的自定义缓存属性装饰器。

python: are property fields being cached automatically?Is there a decorator to simply cache function return values?

【讨论】:

以上是关于python中的计算静态属性的主要内容,如果未能解决你的问题,请参考以下文章

Python 静态属性Property

python学习笔记之面向对象中的静态方法类方法属性方法总结

Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法

python学习第18天----属性类方法静态方法

Python类-静态方法类方法属性方法

python:静态方法类方法属性方法