给定一个具有某些属性的自定义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尚未设置。
答案 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方法中的第一个赋值以分号结束(原始代码中没有)。
总结:
正如预期的那样,在构造函数之后调用get.poop()
方法。这是在MATLAB R2012a上测试的,但我坚信这不是版本问题。
调用get.poop()
方法的原因是因为作业myCat = Cat(config)
未以分号;
结束。
<强>理由:强>
未以分号结束的分配的默认行为是显示分配结果。显示对象意味着显示公共属性的值等。要获取公共属性poop
的值,请调用get.poop()
;这解释了吸气器的召唤。一旦语句更改为myCat = Cat(config);
,就不再调用getter,因为分配的结果不再显示。
稍后注意:
请注意,每次显示对象的请求都会调用getter。所以,是的,当构造函数仍由调试器暂停时,可能会调用getter,因为您检查poop
成员。