MATLAB 面向对象编程(九)对象的save和load以及自定义方法

无需关注,查看原文
当我们使用命令save matlab.mat Point表示将对象Point保存到matlab.mat文件中,load matlab.mat obj表示装置matlab.mat文件中obj的内容。

  1. save保存的内容
    1.object所属类的名称以及package的名称
    2.object所属类的属性的默认值
    3.object中的普通属性的值
  • save保存成mat文件实际上存储的是一个结构体,对应存储着属性名和值

  1. 在save之后更改定义,对load的影响
    1. 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,增加属性z,在load之后得到的对象会保存x和y的值,并增加z属性,但内容为空。
    2. 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,将x属性名称改为X,在load之后得到的对象会保存y的值并将x属性更改为X,但内容为空。
    3. 假设Point类中x和y两个对象的默认值为0,在save一个对象之后更改类的定义,将属性默认值改为1,在load之后得到的对象属性值仍然为0,因为在load的过程中并不会调用类的构造函数。
  • 注意类的定义需要在当前路径中,否则会装载错误。

  1. 自定义saveobj和loadobj方法
    MATLAB在执行save和load命令时,实际上会调用类的saveobj和loadobj方法,就像之前我们讲set和get方法一样,我们可以自定义saveobj和loadobj来自定义保存的格式和内容。
classdef Point < handle  % Point.m
    properties
        x
        y
    end
    methods
        function obj = Point(x,y)
            if nargin ==0
                x = [];
                y = [];
            elseif nargin ==2
            obj.x = x;
            obj.y = y;
            else
                error('Not enough input arguments')
            end
        end
        function s = saveobj(obj)
            s.x = obj.x;
            s.y = obj.y;
        end
    end
    methods(Static)
        function obj = loadobj(s)
            obj = Point();            
            obj.x = s.x;
            obj.y = s.y;
        end
    end
end
  • 需要注意的是,saveobj返回的是一个结构体,对应对象的属性和内容,loadobj的输入是结构体,返回的是一个对象,二者显著的不同在于saveobj是普通方法,而loadobj是静态方法,因为在load的时候对象还没有创建。

  1. 继承情况下的saveobj和loadobj
classdef Point2 < Point  % Point2.m
    properties
        z
    end
    methods
        function obj = Point2(x,y,z)
            if nargin == 0
                x = [];
                y = [];
                z = [];
            end
            obj = obj@Point(x,y);
            obj.z = z;
        end
        function s = saveobj(obj)
            s = saveobj@Point(obj);
            s.z = obj.z;
        end
    end
    methods (Static)
        function obj = loadobj(s)
            obj = Point2(s.x,s.y,s.z);
        end
    end
end

和继承中的构造函数一样,为了降低耦合需要调用父类的方法处理父类中的属性,saveobj也是需要调用父类的saveobj保存父类的属性然后再保存子类添加的属性,loadobj要稍微复杂一些,如果直接生搬硬套会出错,这里建议还是耦合吧。如果直接在子类中调用父类的loadobj会出错的,因为保存的对象是Point2类,Point类的loadobj的输入类型不是Point2类,因此在此处会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆拾伍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值