猿问

从 Oct2Py 返回类对象

我正在尝试运行一个定义类的基本 MATLAB 脚本,并将该类对象返回给 python。我不太了解 MATLAB,而且对 Oct2Py 很陌生,所以我可能完全误解了如何做到这一点。任何帮助将不胜感激。

这是 Matlab 文件(取自此处

classdef BasicClass

   properties

      Value {mustBeNumeric}

   end

   methods

      function r = roundOff(obj)

         r = round([obj.Value],2);

      end

      function r = multiplyBy(obj,n)

         r = [obj.Value] * n;

      end

   end

end

我在 python 脚本中使用以下命令调用它


from oct2py import octave

octave.addpath(r'C:\Users\i13500020\.spyder-py3\IST')

oclass = octave.class_example(nout=1)

当我运行这个程序时,我收到一条打印四次的警告,然后是一条错误消息


第一的:


warning: struct: converting a classdef object into a struct overrides the access restrictions defined for properties. All properties are returned, including private and protected ones.

进而:


TypeError: 'NoneType' object is not iterable

我从 Oct2Py 页面运行往返示例没有任何问题,所以我知道我的安装没问题



慕无忌1623718
浏览 98回答 1
1回答

慕森卡

我编写了一个小解决方案,将自定义 matlab 类与 oct2py 一起使用。目前,这种方法仅支持访问 Matlab 类的成员函数(而不是属性),因为这正是我所需要的:from oct2py import octaveclass MatlabClass():    _counter = 0    def __init__(self, objdef) -> None:        """Use matlab object as python class.        Args:            objdef (str): Class initialization as string.        """        MatlabClass._counter += 1        self.name = f"object_for_python{MatlabClass._counter}"        octave.eval(f"{self.name} = {objdef};")        def __getattr__(self, item):        """Maps values to attributes.        Only called if there *isn't* an attribute with this name        """        def f(*args):            call = f"{self.name}.{item}({','.join([str(arg) for arg in args])});"            return octave.eval(call)        return f按如下方式使用此类:param = 0.24 # random value you might need for class initializationoclass = MatlabClass(f"BasicClass({param})")x = oclass.roundOff()y = oclass.multiplyBy(2)注意:您可能需要在 Octave 代码中使用 init 函数来运行设置 Value 变量。
随时随地看视频慕课网APP

相关分类

Python
我要回答