代码之家  ›  专栏  ›  技术社区  ›  user36800

在加载Matlab、Mixin、可拷贝对象时停止使用集合方法的MATLAB?

  •  2
  • user36800  · 技术社区  · 6 年前

    我有一个来自于我的名字。有些酒店 set 方法。我希望这些属性的设置也更新其他属性,以便参数之间的关系是一致的(set方法的经典用法)。

    不幸的是,当我 load *.mat 文件[具体地说, x=load('file.mat') ],也使用setter。不需要对多个参数进行这种自动更新,因为所有对象的属性都可以从*.mat文件中复制,并且自动保持自一致性。相反,在 负载 由于setter使用的其他属性尚未在 负载 过程。我从发生在 负载 ,并检查setter所需的属性。

    有没有办法强迫 负载 要对包含 *.材料 文件? 有些属性本身是复杂的对象,因此需要在 负载 是的。在 负载 ,原因如下。

    上面我说,setter使用了另一个尚未分配的属性。我们把这个叫做财产 p2 是的。它也由第三个属性的setter分配给 s1 是的。看起来很奇怪,但是 第一节 有价值,而 P2页 没有。一个可能的原因是 P2页 除了 第一节 ,而这些可能未分配给 第一节 加载(即,当 第一节 调用setter)。整个问题源于这样一个事实 负载 在上下文外部发生,以及在创建属性的代码执行期间属性的分配顺序。这就是为什么(在我看来) 负载 应该 使用setters。否则,它似乎与复制或加载都不兼容(我目前不确定是哪一个——可能两者都不兼容)。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Cris Luengo    6 年前

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

    还有一页解释如何 modify the save and load process 是的。本页介绍了 loadobj ,定义为类的静态方法,以更改如何根据文件中的信息构造对象。 加载对象 当其中一个 set 方法抛出错误;但它总是在 saveobj 返回结构。也就是说,解决你的问题的方法之一就是 萨维奥布 创建一个包含所有数据的结构,并 加载对象 从那个结构重建你的对象。

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