我想以相同的方式解析几个类方法的变量输入,所以我写了一个方法来做到这一点,并打算根据需要从其他方法调用它。但是,当我从methodB
拨打methodA
时,varargin{:}
不会作为其单元格内容传递,而是作为另一个单元格数组传递 - 类似于我没有包含{:}
。
有没有人知道为什么内容没有通过?
methods
function varargout = methodA(obj,varargin)
[obj,t.start,t.stop,prn,elevLim,t.interval] = methodB(varargin{:});
end
function varargout = methodB(varargin)
% parse inputs here...
%output parsed inputs to calling function
varargout = {obj,t.start,t.stop,prn,elevLim,t.interval};
end
end
答案 0 :(得分:3)
当您尝试使用问题中所述的代码时,您将收到有用的错误消息。如果您写methodB(varargin)
,则此消息为:
未定义函数'methodB'表示'double'类型的输入参数。
编写methodB(varargin{:})
时,它是:
未定义函数'methodB'用于'cell'类型的输入参数。
这里的主要问题是你没有明确地将methodB
的第一个参数定义为对象变量。这是必需的,因为methodB
是所谓的ordinary method,因为它没有被定义为静态。代码中还有一些其他问题。例如methodA
永远不会向varargout
分配内容而methodB
应该返回obj
,而methodB
也没有定义。
function varargout = methodB(obj,varargin)
需要有一个明确定义的对象变量,因此定义的第一行应该是:obj
。但是,如果我们在方法本身中不需要~
,我们可以将其替换为methodB(obj,varargin{:})
,因此不会将其分配给变量。obj.methodB(varargin{:})
或classdef nestedvarargin
properties
end
methods
function varargout = methodA(obj,varargin)
[t.start,t.stop,prn,elevLim,t.interval] = methodB(obj,varargin{:}); % call ordinary method (syntax 1)
% [t.start,t.stop,prn,elevLim,t.interval] = obj.methodB(varargin{:}); % call ordinary method (syntax 2)
varargout = {t.start,t.stop,prn,elevLim,t.interval};
end
function varargout = methodB(~,varargin)
% extract desired values from varargin (for example leave 3rd argument out)
varargout = {varargin{1},varargin{2},varargin{4},varargin{5},varargin{6}};
end
end
end
。以下是验证它的工作代码:
methodB
baseclass.methodB(varargin{:})
定义为静态,并将其命名为classdef nestedvarargin
properties
end
methods
function varargout = methodA(obj,varargin)
[t.start,t.stop,prn,elevLim,t.interval] = nestedvarargin.methodB(varargin{:}); % call static method
varargout = {t.start,t.stop,prn,elevLim,t.interval};
end
end
methods(Static)
function varargout = methodB(varargin)
% extract desired values from varargin (for example leave 3rd argument out)
varargout = {varargin{1},varargin{2},varargin{4},varargin{5},varargin{6}};
end
end
end
。在这种情况下,不需要显式定义的对象变量。代码如下所示:
methodB
为了验证功能,您可以使用以下两行。正如5
中定义的那样,第三个参数应该被省略,第六个参数也应该被省略(在下面的例子中是testobj = nestedvarargin;
[a,b,c,d,e] = testobj.methodA(1,2,[],3,4,5,[])
)。
a =
1
b =
2
c =
3
d =
4
e =
5
输出符合预期:
Traceback (most recent call last):
File "logistic_regression.py", line 29, in <module>
import numpy as np
ImportError: No module named numpy