Это принципиальный вопрос для классов, занимающихся математическими/физическими уравнениями, где пользователю разрешено устанавливать любой параметр, на основе которого рассчитываются остальные. В этом примере я хотел бы также установить частоту, избегая циклических зависимостей.
Например:
from traits.api import HasTraits, Float, Property
from scipy.constants import c, h
class Photon(HasTraits):
wavelength = Float # would like to do Property, but that would be circular?
frequency = Property(depends_on = 'wavelength')
energy = Property(depends_on = ['wavelength, frequency'])
def _get_frequency(self):
return c/self.wavelength
def _get_energy(self):
return h*self.frequency
Я также знаю о проблеме синхронизации обновления, потому что я не знаю, в какой последовательности будут запускаться обновления:
- Длина волны меняется
- Это запускает обновление обоих зависимых объектов: частоты и энергии.
- Но энергия нуждается в обновлении частоты, чтобы энергия имела значение, соответствующее новой длине волны!
(Ответ, который будет принят, должен также решить эту потенциальную проблему синхронизации.)
Итак, какой шаблон проектирования лучше всего подходит для решения этих взаимозависимых проблем? В конце я хочу, чтобы пользователь мог обновлять либо длину волны, либо частоту, а частота/длина волны и энергия должны обновляться соответственно.
Такого рода проблемы, конечно, возникают в основном на всех занятиях, которые пытаются иметь дело с уравнениями.
Да начнется соревнование! ;)