我有一个带有一些依赖属性的类,但是我真的只想计算一次。
我刚刚得出结论,对MATLAB中的依赖类属性使用惰性求值是不可能的,也不是一个好主意。最初的计划是为每个需要更新的(公共)属性都拥有一个私有逻辑标志,并让构造函数将其设置为true。然后,当调用属性访问器时,它将检查该标志并计算值,然后仅在需要时才将其存储(在另一个私有属性中)。如果该标志为假,它将仅返回缓存值的副本。
我认为困难在于对财产访问者的约束,即他们不理会其他无关的财产。换句话说,get.property(self)方法不能更改self对象的状态。有趣的是,这在我当前的课程中无声地失败了。 (即,在get。方法中既未设置更新标志,也未设置缓存的计算结果,因此每次都运行昂贵的计算)。
我的怀疑是将惰性属性从公共依赖属性更改为具有公共GetAccess但私有SetAccess的方法有效。但是,我不喜欢以这种方式欺骗属性约定。我希望只有一个“惰性”属性属性可以为我完成所有这些工作。
我是否缺少明显的东西?是否禁止在MATLAB中使用用于依赖类属性的访问器方法来更改类实例的状态?如果是这样,定义具有私有副作用的访问器是获得我想要的行为的最不邪恶的方法吗?
编辑:这是一个测试班...
classdef LazyTest properties(Access = public) % num to take factorial of factoriand end properties(Access = public, Dependent) factorial end properties(Access = private) % logical flag do_update_factorial % old result cached_factorial end methods function self = LazyTest(factoriand) self.factoriand = factoriand; self.do_update_factorial = true; end end methods function result = get.factorial(self) if self.do_update_factorial self.cached_factorial = factorial(self.factoriand); % pretend this is expensive pause(0.5) self.do_update_factorial = false end result = self.cached_factorial; end end end 运行它
close all; clear classes; clc t = LazyTest(3) t.factorial for num = 1:10 tic t.factoriand = num t.factorial toc end 从handle继承后,时间大大减少了。
回答:
我假设您正在使用值类。使用通过引用传递的
句柄类 ( classdef myClass < handle ),您可以轻松地从get方法中修改该类。例如,我使用您建议的内容从文件(如果尚未加载)或私有隐藏属性中加载数据。
请注意,使用lazy依赖属性以某种方式提出您的提议会违背使用依赖属性的目的,即保证您的数据始终与所派生属性的状态保持最新。每次更改其他属性时,您的惰性属性都会过时。
您可以(应该)向所有其他属性添加set方法,以将private属性设置为空( isempty(obj.myPrivateProperty)是“逻辑标志”,您需要知道是否必须进行计算)。但是,如果这样做,为什么不只是让set-methods调用一些update方法来立即更新/重新计算所有“依赖”属性呢?
更多&回答...