You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:25:03