Matlab 对象数组的方法调用相当于 Python 中

问题描述 投票:0回答:1

Matlab 有对象数组,Python 有列表或元组。 在 Matlab 中,在该类的对象数组上调用该类的方法很容易:

A = [Class1(1), Class1(2)];

B = A.toClass2();

请参阅“在对象数组上调用方法”此处

在Python中,这不会是一对一可转移的,因为在第二行,解释器将在List类中查找方法toClass2(),但它不会找到(->错误)。

我发现这个问题可以从该方法定义之外的用户端解决,方法是在 for 循环、列表理解、函数或 lambda 函数的映射中调用它,甚至使用 numpy.vectorize(),请参阅 这个。 这些解决方案中的每一个都意味着用户端有更重的语法,但仍然遗漏了一件事;如果我希望方法 Class1.toClass2() 可以自行决定如何处理作为输入接收的多个对象的列表,该怎么办? 例如,方法 Class1.Sum() 会在逻辑上对应用该方法的所有元素求和并返回单个对象,而另一个方法执行像 Class1.toClass2() 这样的转换也可能返回一个新对象数组。

或者,可以使方法 toClass2() 也接受 List 作为自身输入,并使用以下方法在列表 A 的第二行显式调用它:

B = Class1.toClass2(A) 

这允许方法选择如何处理列表输入,但会在用户端生成稍重的语法。

有人看到另一种解决方案吗? 也许有一个使用方法装饰器、类装饰器,甚至子类化 List 类..

更一般地说,如何将这种 OOP 软件架构设计思想从 Matlab 数组应用到 Python 世界?

python matlab oop architecture vectorization
1个回答
0
投票

对于您眼前的问题有很多解决方案,但通常您无法将语法一对一地从一种语言翻译成另一种语言。每种语言都有自己的语法和特性。

在 MATLAB 中,

A.toClass2()
toClass2(A)
都调用相同的函数。第二种语法可以通过编写一个自由函数(即不是类方法)直接转换为 Python,该函数根据输入的类型执行不同的操作。

另一种替代方法是不在 Python 中创建对象列表,而是让对象包含包含数据的列表(或创建一个包含对象列表的类)。然后您可以自定义作用于该对象的方法。

© www.soinside.com 2019 - 2024. All rights reserved.