Итак, я предполагаю, что у вас есть ситуация, подобная следующей:
import numpy as np
class my_class():
def __init__(self, x, values):
self.x = x
self.values = values
self.totv = np.dot(x, values)
def update_x(self, i, v):
self.x[i] = v
inst = my_class(np.array([1,2,3]), np.array([4,5,6]))
inst.update_x(1, 4)
print(inst.__dict__)
, которая дает:
{'x': array([1, 4, 3]), 'values': array([4, 5, 6]), 'totv': 32}
, потому что:
>>> 1 * 4 + 2 * 5 + 3 * 6
32
ИтакВы хотели бы, чтобы при изменении атрибута x
в методе update_x
, self.totv
переоценивался.
Боюсь, что их нет альтернативы вызову: self.totv = ...
каждый развы модифицируете self.x
.Однако вы можете улучшить читабельность своего кода, определив метод, который обновляет атрибут totv
:
class my_class():
def update_totv(self):
self.totv = np.dot(self.x, self.values)
def __init__(self, x, values):
self.x = x
self.values = values
self.totv = np.dot(x, values)
def update_x(self, i, v):
self.x[i] = v
self.update_totv()
Теперь, если вы вызываете self.update_totv()
после каждой модификации self.x
, self.totv
будет обновлено соответственно.Следовательно, первый код, использующий это новое объявление класса, дает правильный вывод:
{'x': array([1, 4, 3]), 'values': array([4, 5, 6]), 'totv': 42}
, поскольку:
>>> 1 * 4 + 4 * 5 + 3 * 6
42