Matlab是否有Python @classmethod等效实现?子类构造继承问题
在MATLAB中实现可被子类继承的替代构造函数(类似Python的@classmethod)
问题分析
你当前的静态方法fromSomething硬编码了创建A类实例,导致子类B调用时仍返回A的实例。MATLAB没有Python的@classmethod直接实现,但可以利用MATLAB的方法调用特性模拟该功能,且保证代码复用率最高。
解决方案
将父类的fromSomething从静态方法改为普通方法,利用MATLAB允许通过类名调用普通方法的特性(此时会自动创建类的默认实例),在方法内获取当前调用类的名称,再创建对应实例:
修改后的父类A代码
classdef A properties a end methods function obj = A(a) if nargin obj.a = a; end end function obj = fromSomething(~) % 获取当前调用类的名称 cls_name = class(obj); % 创建对应类的实例 obj = feval(cls_name, 42); end end end
子类B代码(无需任何修改)
classdef B < A methods function someFunctionality(obj) disp('This is B''s functionality'); end end end
效果验证
- 调用
A.fromSomething():返回A类实例,a属性为42 - 调用
B.fromSomething():返回B类实例,a属性为42,且可正常调用someFunctionality()方法
原理说明
当你通过类名(如B.fromSomething())调用普通方法时,MATLAB会自动创建该类的默认实例(调用无参构造函数),并将这个实例作为第一个参数传入方法。我们在方法中通过class(obj)获取这个实例的类名,再用feval创建该类的带参实例,最终返回期望的对象。
对比你的尝试
你之前用dbstack的方法无法获取调用类,因为dbstack返回的是方法定义所在的类(即A),而非调用时的类。而本方案利用MATLAB的原生调用特性,直接通过实例获取调用类,更可靠且代码改动极小。
内容的提问来源于stack exchange,提问作者lvdgraaff
相关产品推荐
相关产品推荐

