Matlab中属性访问方法

目录

属性访问方法

属性提供对类数据的访问

属性 set 和 get 方法

set 和 get 方法的执行和属性事件

访问方法和包含数组的属性

访问方法和对象数组

使用访问方法修改属性值


属性访问方法

属性提供对类数据的访问

        在 MATLAB® 中,属性可以具有公共访问权限。因此,属性可以提供在类的设计中向用户公开的数据的访问权限。

        可使用属性访问方法来提供错误检查功能,或实现属性访问所产生的附带效果。访问方法的示例包括可以在设置属性时更新其他属性值的函数,或是可以在返回值之前转换属性值格式的函数。

        有关访问方法语法的具体信息,可以参考属性get方法属性set方法。可以使用属性验证来限制属性值的大小、类和其他方面。有关属性验证的信息,可以参考验证属性值

访问方法的性能注意事项

        无论何时访问属性值,属性访问方法都会增加函数调用的开销。如果发生在类方法内部的属性访问对性能有重大影响,请定义私有属性来存储值。在方法内部使用这些值,而不进行任何错误检查。对于来自类外部的较代频率的访问,请定义使用访问方法进行错误检查的公共 Dependent 属性。

        有关 Dependent 属性的访问方法的信息,参考从属属性的set和get方法。

属性 set 和 get 方法

        每当查询属性值或对属性赋值时,属性访问方法都会执行特定代码。这些方法能够执行各种操作:

  • 在对属性赋值之前执行代码来执行某些操作,例如:

    • 施加值范围限制(验证属性值)

    • 检查类型和维度是否正确

    • 提供错误处理

  • 在返回属性的当前值之前执行代码以执行某些操作,例如:

    • 计算不存储值的属性的值(可以参考按需计算数据)

    • 更改其他属性的值

    • 触发事件(可以参考时间和侦听程序概述)

要控制哪些代码可以访问属性,参考属性特性。

MATLAB 调用访问方法

注意:不能直接调用属性访问方法。MATLAB 会在访问属性值时调用这些方法。

        每当从访问方法外部设置或查询对应的属性值时,属性访问方法都会自动执行。MATLAB 不递归调用访问方法。也就是说,当在 set 方法内部设置属性时,MATLAB 不会调用 set 方法。同样,当在 get 方法内部查询属性值时,MATLAB 不会调用 get 方法。

        从属性meta.property对象获取 set 和 get 访问方法的函数句柄。meta.property SetMethod 和 GetMethod 属性包含引用这些方法的函数句柄。

对访问方法的限制

        定义属性访问方法时应新遵循以下限制:

  • 仅为具体属性(即非抽象属性)定义

  • 仅在定义属性的类中定义(除非属性在该类中是抽象的,此时具体子类必须定义访问方法)。

        MATLAB 没有默认 set 或 get 属性访问方法。因此,如果不定义属性访问方法,MATLAB 软件在对属性赋值或返回属性值之前不会调用任何方法。

        定义后,只有 set 和 get 方法可以设置和查询实际属性值。有关 MATLAB 在哪些情形下不会调用属性 set 方法的信息,可以参考调用set方法时。

注意:属性的 set 和 get 访问方法与用户可调用的 set 和 get 方法(用于通过类实例设置和查询属性值)并不等同。有关用户可调用的 set 和 get 方法的信息,可以参考为属性实现set/get接口。

访问方法无法调用函数来访问属性

        只能从属性set或get访问方法内设置和获取属性值。无法从set或get方法调用另一个函数并尝试从该函数访问属性值。

        例如,调用另一个函数来执行实际工作的匿名函数无法访问属性值。同样,访问函数无法调用另一个函数来访问属性值。

定义访问方法

        访问方法有带属性名称的特殊名称。因此,每当引用 PropertyName 时,就会执行 get.PropertyName;每当对 PropertyName 赋值时,就会执行 set.PropertyName。

        在不指定特性的方法代码块中定义属性访问方法。无法直接调用这些方法。MATLAB 只会在有代码访问属性时,才会调用这些方法。

        属性访问方法不会出现在methods命令返回的类方法列表中,也会不包括在 meta.class 对象 Methods 属性中。

访问方法函数句柄

        属性meta.property对象包含属性 set 和 get 方法的函数句柄。SetMethod包含set方法的函数句柄。GetMethod包含get方法的函数句柄。

        从meta.property对象获取这些句柄:

mc = ?ClassName;
mp = findobj(mc.PropertyList,'Name','
PropertyName
');
fh = mp.GetMethod;

        例如,如果类 MyClass 为其Text属性定义了get方法,则可以从 meta.class对象获取此函数的函数句柄:

mc = ?MyClass;
mp = findobj(mc.PropertyList,'Name','Text');
fh = mp.GetMethod;

        返回值fh包含为指定类的指定属性名称定义的 get 方法的函数句柄。有关定义函数句柄的信息,可以参考创建函数句柄

set 和 get 方法的执行和属性事件

        MATLAB 软件在 set 和 get 操作前后生成事件。可以使用这些事件来通知侦听程序已引用属性值或已为属性赋值。生成事件的时间点如下所示:

  • PreGet - 在调用属性 get 方法之前触发

  • PostGet - 在属性 get 方法返回其值之后触发

        如果类计算属性值 (Dependent = true),则其 set 事件的行为就像 get 事件一样:

  • PreSet - 在调用属性 set 方法之前触发

  • PostSet - 在调用属性 set 方法之后触发

        如果不计算属性值(默认为 Dependent = false),则使用 set 方法的赋值语句会生成事件:

  • PreSet - 在 set 方法中新赋属性值之前触发

  • PostSet - 在 set 方法中新赋属性值之后触发

访问方法和包含数组的属性

        可以对包含数组的属性使用数组索引,而无需直接调用属性的 set 和 get 方法。

        对于索引引用:

val = obj.PropName(n);

MATLAB 调用 get 方法以获取引用的值。

对于索引赋值:

obj.PropName(n) = val;

MATLAB:

  • 调用 get 方法以获取属性值

  • 对返回的属性执行索引赋值

  • 将新属性值传递给 set 方法

访问方法和对象数组

        当引用或赋值发生在对象数组上时,MATLAB 在循环中调用 set 和 get 方法。在此循环中,MATLAB 始终将标量对象传递给 set 和 get 方法。

使用访问方法修改属性值

        如果要在为属性赋值或返回属性值之前执行一些附加步骤,则属性访问方法非常有用。例如,Testpoint类使用属性set方法检查值的范围。如果在特定范围内,则应用缩放,如果不在,则将其设置为NaN。

        属性get方法在返回当前值之前应用缩放因子:

classdef Testpoint
   properties
      expectedResult = []
   end
   properties(Constant)
      scalingFactor = 0.001
   end
   methods
      function obj = set.expectedResult(obj,erIn)
         if erIn >= 0 && erIn <= 100
            erIn = erIn.*obj.scalingFactor;
            obj.expectedResult = erIn;
         else
            obj.expectedResult = NaN;
         end
      end
      function er = get.expectedResult(obj)
         er = obj.expectedResult/obj.scalingFactor;
      end
   end
end

上一篇:基于Halcon学习的一维码识别【十八】gs1databar_composite.hdev


下一篇:限制docker容器的CPU使用