Возврат объекта класса из Oct2Py

#python #matlab #oct2py

#python #matlab #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:Usersi13500020.spyder-py3IST')
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. На данный момент я только что установил пробную версию MATLAB и использую движок MATLAB, который содержит больше документации и примеров. Дает мне 30 дней, чтобы выработать все, что мне нужно, ха-ха. Все же было бы неплохо, если бы кто-нибудь ответил и прояснил некоторые варианты использования для Oct2Py

Ответ №1:

Я написал небольшую работу по использованию пользовательских классов 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 для запуска set вашей переменной Value.