python - 首次使用时初始化属性

标签 python python-3.x

我很好奇什么是创建在第一次使用时初始化其值的属性属性的更好模式。下面是一个主题有几个变化的类。

def some_initializer(s):
    return f"Value: {s}"

class Foo(object):
    """ Initialize on first use properties """
    def __init__(self):
        self._prop1 = None

    @property
    def prop1(self):
        """ Existing private member attribute """
        if not self._prop1:
            self._prop1 = some_initializer("prop1")
        return self._prop1

    @property
    def prop2(self):
        """ Create private attribute on demand """
        if not hasattr(self, "_prop2"):
            self._prop2 = some_initializer("prop2")
        return self._prop2

    @property
    def prop3(self):
        """ Create private attribute on demand - shorter """
        self._prop3 = getattr(self, "_prop3", some_initializer("prop3"))
        return self._prop3

    @property
    def prop4(self):
        """ Stash value in attribute with same name as property """
        _prop4 = self.__dict__.get('_prop4')
        if _prop4 is not None:
            return _prop4
        self._prop4 = _prop4 = some_initializer("prop4")
        return _prop4

>> f = Foo()
>> print(f.prop1)
>> print(f.prop2)
>> print(f.prop3)
>> print(f.prop4)
Value: prop1
Value: prop2
Value: prop3
Value: prop4

过去我使用过变体 prop1、prop2 和 prop3。最近我被介绍了 prop4 变体,我觉得它很困惑,尽管在技术上可能是正确的。这些变化有什么缺点,或者有更好的方法吗?

编辑:理想情况下,保持与属性 setter 和删除器装饰器的兼容性会很好。

最佳答案

我只会写一个自定义描述符并使用它:

class cached_property:
    def __init__(self, f):
        self.f = f

    def __get__(self, instance, owner):
        if not instance:
            return self

        res = instance.__dict__[self.f.__name__] = self.f(instance)
        return res

用法:

class C:
    @cached_property
    def prop(self):
        print('you will see me once')
        return 4

关于python - 首次使用时初始化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55869301/

相关文章:

python - 向我的船指向的方向发射子弹

python - 沿着时间序列索引连接 pandas 数据帧而不重复列

python - 当下游任务定义依赖于上游结果时如何设置 DAG

python-3.x - 带魔杖的谷歌云功能停止工作

python-3.x - 将 PyFolio 与 Pandas 一起使用

python-3.x - 找到更好的方法来查找字符串中包含多个相同符号的文本

python - 打印 dask 系列/数据框的简单方法?

python - MySQL 比较两个条目之间的相同字段 - 查询需要很长时间

python - Postgres时间戳不接受2017-01-01T23 :00:00-00:00

python - 在一个范围内生成多组随机的、不重叠的间隔