相关疑难解决方法(0)

替换属性以获得性能增益

情况

此问题类似,我想替换一个属性.与那个问题不同,我不想在子类中覆盖它.我想在init和属性本身中替换它以提高效率,这样它就不必调用每次调用属性时计算值的函数.

我有一个课程,里面有一个属性.构造函数可以获取属性的值.如果传递了值,我想用值替换属性(不只是设置属性).这是因为属性本​​身会计算该值,这是一项昂贵的操作.类似地,我想用属性计算的值替换属性,以便将来对属性的调用不必重新计算:

class MyClass(object):
    def __init__(self, someVar=None):
        if someVar is not None: self.someVar = someVar

    @property
    def someVar(self):
        self.someVar = calc_some_var()
        return self.someVar
Run Code Online (Sandbox Code Playgroud)

问题

上面的代码不起作用,因为执行self.someVar =不会替换someVar函数.它试图调用属性的setter,它没有定义.

潜在解决方案

我知道我可以用稍微不同的方式实现同​​样的目的:

class MyClass(object):
    def __init__(self, someVar=None):
        self._someVar = someVar

    @property
    def someVar(self):
        if self._someVar is None:
            self._someVar = calc_some_var()
        return self._someVar
Run Code Online (Sandbox Code Playgroud)

这将略微降低效率,因为每次调用属性时都必须检查None.该应用程序对性能至关重要,因此这可能会或可能不够好.

有没有办法替换类实例上的属性?如果我能够做到这一点会有多高效(即避免无检查和函数调用)?

python properties

6
推荐指数
1
解决办法
1183
查看次数

标签 统计

properties ×1

python ×1