这是一个处理数学/物理方程的类的设计原则问题,用户可以设置任何其余参数正在计算的参数。 在这个例子中,我希望能够设置频率,同时避免循环依赖。如何在设置属性时避免循环依赖?
例如:
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
我也知道这里的更新触发时机的问题,因为我不知道该序列的更新将被触发:
- 波长为已更改
- 触发两个相关实体的更新:频率和能量
- 但是,需要更新能量频率以便能量具有fitt值对新的波长!
(答案被接受还应该解决这个潜在的计时问题。)
那么,什么是最好的设计模式来解决这些相互依存的问题?最后,我希望用户能够更新波长,频率和频率/波长,并且能量应相应更新。
这种问题当然会出现在基本上所有试图处理方程的类中。
让比赛开始吧! ;)
我认为traits.api可能会满足您的需求。是否有任何理由标准问题属性不适合你?特质主要用于建立课间,而不是从我在他们的页面上看到的课堂内依赖关系;你正在做类内依赖关系。 – 2012-03-30 21:52:18
我不同意,因为类内依赖对设计GUI非常有帮助,相关的traits.ui库建立在特征之上。 – 2012-03-30 21:55:22
即用于解决某些计算/数据分析任务的迷你GUI或小型应用程序。这些功能对于大规模GUI应用程序来说效果如何,我不知道,但至少对于GUI元素触发内容和其他内容的快速应用程序开发自动更新而言,这些属性是非常巧妙的。 – 2012-03-30 21:58:38