小编Seb*_*ian的帖子

使用重载装饰器的延迟加载变量

我有一个代表系统的状态对象.状态对象中的属性从[huge]文本文件中填充.因为每次创建状态实例时都不会访问每个属性,所以延迟加载它们是有意义的:

class State:
    def import_positions(self):
        self._positions = {}
        # Code which populates self._positions

    @property
    def positions(self):
        try:
            return self._positions
        except AttributeError:
            self.import_positions()
            return self._positions

    def import_forces(self):
        self._forces = {}
        # Code which populates self._forces

    @property
    def forces(self):
        try:
            return self._forces
        except AttributeError:
            self.import_forces()
            return self._forces
Run Code Online (Sandbox Code Playgroud)

这里有很多重复的样板代码.此外,有时import_abc可以填充一些变量(即,如果已经打开,则从一个小数据文件中导入一些变量).

重载@property是有意义的,它接受一个"提供"该变量的函数,即:

class State:
    def import_positions(self):
        self._positions = {}
        # Code which populates self._positions

    @lazyproperty(import_positions)
    def positions(self):
        pass

    def import_forces(self):
        self._forces = {}
        # Code which populates self._forces and self._strain

    @lazyproperty(import_forces)
    def forces(self):
        pass

    @lazyproperty(import_forces) …
Run Code Online (Sandbox Code Playgroud)

python lazy-loading decorator

5
推荐指数
1
解决办法
473
查看次数

标签 统计

decorator ×1

lazy-loading ×1

python ×1