这是处理数学/物理方程的类的设计原则问题,其中允许用户设置计算剩余部分的任何参数。在这个例子中,我希望能够在避免循环依赖的同时设置频率。
例如:
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
我也知道这里有一个更新触发时间问题,因为我不知道触发更新的顺序:
- 波长正在改变
- 这会触发两个相关实体的更新:频率和能量
- 但是能量需要更新频率,以便能量具有适合新波长的值!
(被接受的答案也应该解决这个潜在的时间问题。)
那么,解决这些相互依赖的问题的最佳设计模式是什么?最后,我希望用户能够更新波长或频率,并且频率/波长和能量应相应更新。
当然,基本上所有尝试处理方程式的课程都会出现这类问题。
让比赛开始吧!;)