写在之前(吐槽)
最近由于变化了一些工作方向,开始需要使用matlab进行开发,哎哟喂,matlab使用的我想吐,那个matlab编辑器又没代码提示,又没彩色,我只好用vscode进行代码编辑,然后使用matlab软件运行,我的评价是,想吐,但是没法,学术上算法好像都是matlab跑的,所以到底图啥呢,不理解。
matlab类
如同其他类一样,类都是面向对象的产物包括python java 以及C++,都会有类的一些定义,有很多东西在不同的语言条件下是不一样的,这些包括什么私有属性和公有属性,以及构造函数,还有继承啊,父类子类巴拉巴拉的,需要进行一番查询,这里蛮推荐gpt干这一类事情的,因为真的很方便,在网上找相关的资料,有些要么就是一坨讲不清楚,有些讲的很好但是针对你想问的一些问题并不能很好的解答,所以大大增加了一些学习成本,如我在gpt里面问
他会很好的解答你,如何并回答,你有什么问题也会解答你。但是,终归还是有但是,他有些东西是有错误的,你必须要自己去修改,如下所述就是一个
handle类和value类的区别
我在写代码的时候遇到这样一个情况,下面一段代码如下
classdef MyClass
properties
myProperty
end
methods
function obj = MyClass(initialValue)
% 构造函数,初始化属性值
obj.myProperty = initialValue;
end
function modifyProperty(obj, newValue)
% 在类方法中修改属性值
obj.myProperty = newValue;
end
end
end
有这样一段代码,我定义了一个MyClass
的类,然后里面有个myProperty
的属性,我在构造函数里面初始化了这个值,需要在下面的modifyProperty
方法里面去修改值,如这样
myObject = MyClass(42); % 创建对象并初始化属性为 42
disp(myObject.myProperty); % 显示属性的值
myObject.modifyProperty(100); % 在类方法中修改属性的值
disp(myObject.myProperty); % 显示修改后的属性值
对于其他的面向对象语言来说,这是非常直觉的,我直接修改即可了,但是在这一段代码里你会发现,握草修改不成功,很离谱(我目前使用的版本是2020不排除以后matlab进行修改的可能性)
经过一番查询,我发现一些端倪,有一个value类和一个handle类的说法,如果你在这里定义类的时候继承了handle类,如下
classdef MyClass < handle
就会非常神奇的发现,他修改成功了,amazing!
那matlab的handle类和value类有什么区别呢,在于拷贝的区别。
handle 类
- handle 类的对象是通过引用传递的。这意味着当你将一个 handle 类的对象赋值给另一个变量时,实际上只是创建了一个指向相同对象的新引用,而不是复制对象本身。
- 修改一个 handle 类的对象将影响所有指向该对象的引用,因为它们共享相同的对象。
- handle 类适用于需要在不同地方共享和修改相同对象的情况,例如在多个函数之间传递和修改对象。
value 类
- value 类的对象是通过值传递的。这意味着当你将一个 value 类的对象赋值给另一个变量时,实际上创建了该对象的一个独立副本,而不是共享相同的对象。
- 修改一个 value 类的对象不会影响其他对象的值,因为它们都有自己的独立副本。
- value 类适用于需要创建和维护独立副本的情况,以避免不同部分的代码共享相同的数据。
其实学过c语言的人对这个概念就感觉不会很陌生,这不就是一个是复制值进去,一个是复制指针进去吗,在python里也一样一个是浅复制,一个是深复制而已,的确如此。
他的复制值导致的一个问题就是在于我们在下面的那个myObject.modifyProperty
方法里面修改的obj.myProperty
并不是真正你在类定义里面的那个地址的值,而是复制过去的新地址的同样值所以导致你在该方法中赋值是有效的,一旦超过那个域你就会发现修改是无效的。
而且在matlab中,如果你不进行继承handle这一步操作的话,直接定义一个类,他默认是继承value类,这就导致你用的都是**“浅复制”**。
这也就是无法修改类属性值的根本原因(奇怪的知识又增加了hhhh)
这篇博客的老哥写的也非常清楚,大家可以参考一下https://blog.csdn.net/qq_43157190/article/details/104101122