为了账号安全,请及时绑定邮箱和手机立即绑定

从 Oct2Py 返回类对象

从 Oct2Py 返回类对象

慕无忌1623718 2023-09-19 14:12:01
我正在尝试运行一个定义类的基本 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   endend我在 python 脚本中使用以下命令调用它from oct2py import octaveoctave.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 页面运行往返示例没有任何问题,所以我知道我的安装没问题
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

我编写了一个小解决方案,将自定义 matlab 类与 oct2py 一起使用。目前,这种方法仅支持访问 Matlab 类的成员函数(而不是属性),因为这正是我所需要的:


from oct2py import octave


class 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 initialization

oclass = MatlabClass(f"BasicClass({param})")

x = oclass.roundOff()

y = oclass.multiplyBy(2)

注意:您可能需要在 Octave 代码中使用 init 函数来运行设置 Value 变量。


查看完整回答
反对 回复 2023-09-19
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信