Matlab:Getter在构造函数之前运行?

时间:2014-07-04 09:37:40

标签: matlab

给定一个具有某些属性的自定义get方法的对象,Matlab在执行类构造函数之前是否执行了一些代码(getter)?

即使我将属性的默认值设置为空,并且让getter(!)打开与文件的io连接,当我单步执行调试器时,即使在第一行,该对象也已定义为文件。 io(使用与构造函数运行之前对象可用信息对应的文件路径)。这怎么可能,以及这个实现背后的原因是什么?

编辑:get方法中的断点不会停止调试器,因此我不确定它是否实际执行过。

编辑2:在执行第一行之前,调试器在第一行中停止后,似乎在输入构造函数后执行了getter。虽然在get方法中断点处没有停止......


根据要求,一些代码:

classdef Cat < handle
properties
    filename
    poop = [];  % my data matrix the cat is there to produce/manage
end
methods
    function obj = Cat(config)
        obj.filename = config.FILENAME; % Halt debugger in this line
    end
    function value = get.poop(obj)
        obj.poop = matfile(obj.filename)
        value = obj.poop.ingredients; % 'ingeredients' being the name of the variable in poopfile.mat
    end
end
end

要调试,我打电话

myCat = Cat(config)

来自不同的脚本。清除工作区并重新路径。

当调试器停止时,obj.poop不是[],但是已经是对某个未定义文件的引用,并且对链接文件obj.poop.Source的引用是空的,这显然是obj .filename尚未设置。

1 个答案:

答案 0 :(得分:3)

测试设置:

略微修改了类Cat.m

    classdef Cat < handle
            properties
                    filename
                    poop = [];
            end

            methods
                    function obj = Cat(config)
                            display('In constructor.');
                            obj.filename = config.FILENAME;
                    end

                    function value = get.poop(obj)
                            display('In poop getter.');
                            obj.poop = matfile(obj.filename);
                            value = obj.poop.ingredients;
                    end
            end
    end

显示类方法的执行顺序,以及test.m脚本:

    ingredients = 1:100;
    save('a', 'ingredients');

    config.FILENAME = 'a.mat';

    myCat = Cat(config)

我得到了以下结果:

    >>test
    In constructor.

    myCat = 

    In poop getter.
      Cat handle

      Properties:
        filename: 'a.mat'
            poop: [1x100 double]

      Methods, Events, Superclasses

请注意,getter方法中的第一个赋值以分号结束(原始代码中没有)。

总结:

  1. 正如预期的那样,在构造函数之后调用get.poop()方法。这是在MATLAB R2012a上测试的,但我坚信这不是版本问题。

  2. 调用get.poop()方法的原因是因为作业myCat = Cat(config)未以分号;结束。

  3. <强>理由:

    未以分号结束的分配的默认行为是显示分配结果。显示对象意味着显示公共属性的值等。要获取公共属性poop的值,请调用get.poop();这解释了吸气器的召唤。一旦语句更改为myCat = Cat(config);,就不再调用getter,因为分配的结果不再显示。

    稍后注意:

    请注意,每次显示对象的请求都会调用getter。所以,是的,当构造函数仍由调试器暂停时,可能会调用getter,因为您检查poop成员。