与此问题类似,我想替换一个属性.与那个问题不同,我不想在子类中覆盖它.我想在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.该应用程序对性能至关重要,因此这可能会或可能不够好.
有没有办法替换类实例上的属性?如果我能够做到这一点会有多高效(即避免无检查和函数调用)?