Положение
Аналогично этот вопрос , я хочу заменить свойство. В отличие от этого вопроса, я не хочу переопределять его в подклассе. Я хочу заменить его в 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
Задача
Приведенный выше код не работает, поскольку выполнение self.someVar = не заменяет функцию someVar. Он пытается вызвать установщик свойства, который не определен.
Потенциальное решение
Я знаю, что могу достичь того же самого, немного по-другому:
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
Это будет незначительно менее эффективно, так как при каждом вызове свойства будет проверяться None. Приложение критически важно для производительности, так что это может быть или не быть достаточно хорошим.
Вопрос
Есть ли способ заменить свойство в экземпляре класса? Насколько эффективнее было бы, если бы я мог это сделать (т.е. избежать проверки None и вызова функции)?