【问题标题】:Stop Matlab from using set methods when loading matlab.mixin.Copyable object?加载 matlab.mixin.Copyable 对象时阻止 Matlab 使用 set 方法?
【发布时间】:2018-07-09 22:38:29
【问题描述】:

我有一个派生自 matlab.mixin.Copyable 的类。一些属性有set 方法。我希望这些属性的设置也更新其他属性,以便参数之间的关系保持一致(set 方法的经典用法)。

不幸的是,当我load 一个*.mat 文件[特别是使用,比如x=load('file.mat')] 时,也使用了setter。不需要对多个参数进行那种自动更新,因为所有对象的属性都可以从 *.mat 文件中复制,并且自动保持自一致性。相反,在load 期间使用setter 会导致错误,因为setter 使用尚未在load 进程中分配的其他属性。我从load 期间发生的错误以及检查设置器所需的属性中看到了这一点。

有什么方法可以强制load 对包含*.mat 文件的属性值进行简单复制? 一些属性本身就是复杂的对象,所以需要一个load 期间按值递归复制。由于上述原因,在load 期间使用设置器似乎相当不合适。

附:我在上面说过,setter 使用了另一个尚未分配的属性。我们将此属性称为p2。它还由第三个属性s1 的设置器分配给它。这看起来很奇怪,但s1 确实 有一个值,而p2 没有。一个可能的原因是p2 依赖于除s1 之外的其他属性,并且在加载s1 时(即调用s1 设置器时)可能没有分配这些属性。整个问题源于load 发生在上下文之外以及在执行创建它的代码期间分配属性的顺序。这就是(在我看来)load 应该使用 setter 的关键原因。否则,它似乎与复制或加载都不兼容(我目前不确定哪个 - 可能两者兼而有之)。

【问题讨论】:

    标签: matlab oop


    【解决方案1】:

    MATLAB 用来加载对象的过程是well documented。此页面提到,除许多其他事项外,调用 set 方法是为了防止在类定义更改时发生问题,并且您尝试从旧文件中加载该类中的对象。

    还有一个页面解释如何modify the save and load process。本页描述了 loadobj 的使用,它定义为类的静态方法,以更改从文件中的信息构造对象的方式。当set 方法之一抛出错误时调用loadobj;但如果saveobj 返回一个结构,它总是会被调用。也就是说,您的问题的一种解决方案是让saveobj 创建一个包含所有数据的结构,并让loadobj 从该结构重建您的对象。

    This other documentation page 描述了如何设计你的类以避免属性初始化顺序依赖——这是你描述的问题。做到这一点的方法是让所有公共属性成为依赖属性,“实际”数据属性被隐藏而不是相互依赖。您可能能够以这种方式构建您的类,例如使用单个数据属性(单元格数组或结构),它将一次性加载和保存,而公共属性只需使用此单元格或结构的一部分set 和 get 方法。

    【讨论】:

    • 谢谢,克里斯。你是对的,这是有据可查的。它只是没有出现我的 google-fu。我会尽量避免重新规划我的课程,因为它已经在一个相对成熟的应用程序中。另外,我的属性通常是依赖和独立的,这就是我想要的效果。我只是没有意识到它会与load不兼容。
    • 我将仔细研究 loadobj 和 saveobj,但即使我弄清楚了输入和输出,我怀疑还有其他的龙潜伏着,例如,某些属性是大型对象的句柄。我也许可以在load 之后重新分配这些,但它开始越来越远离单个语句load——这是我需要的,因为我在调试的上下文中使用它,并且不想被设计问题所困扰以解决load 并发症。可能是时候重新考虑调试了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多