我知道可以做类似的事情
i = numpy.array([1,0,0])
j = numpy.array([0,1,0])
k = numpy.array([0,0,1])
a = 2*i + 5*j + 9*k
但是否可以利用与复数处理方式类似的语法,并创建一个可以确定 2i + 5j + 9k
是我的类的成员的类,并自动创建它?
或者它是否需要通过改变它解析文件的方式来改变 python 解释器?我已经查看了语法文件,但我只能看到它暗示的是 NUMBER
,并且一次也没有提到 j
。
我还查看了 parsermodule.c , 但无法轻易发现其中的任何内容,使它的实现方式变得显而易见。
有人知道这怎么可能吗?
我可能应该补充一点,我实际上并不打算这样做(除非奇迹般地证明它不需要重新编译我自己的 python 版本,除了学术之旅之外,这样做是疯狂的),但只是出于对语言如何工作的好奇。
最佳答案
您可以编写一个继承自 numpy.ndarray 的类(即子类)来覆盖 repr 方法(负责控制对象如何打印到控制台),如下所示:
import numpy
class Vector3DDisplay(numpy.ndarray):
def __init__(self, vector):
if len(vector) == 3:
self.vec = numpy.array(vector)
else:
raise TypeError('Vector must be of length 3.')
def __repr__(self):
return str(self.vec[0])+'*i + '+str(self.vec[1])+'*j + '+str(self.vec[2])+'*k '
你可能在这里注意到一个明显的问题:实际 vector 是 self.vec,而不是对象本身,所以你所有的 numpy 操作都必须在属性 self.vec 上完成。这样做的原因是 numpy 数组的编写方式很难对其进行子类化(c.f. this question about subclassing C exentsions)。通常,您使用以下方法初始化数组:
>>>> import numpy
>>>> numpy.ndarray(vector)
问题是 np.array 实际上不是一个类,而是 numpy.ndarray 类的工厂函数,它的初始化方式不同,很少使用。您不能让对象从函数继承方法,因此继承并不简单。
关于python - 是否可以用 i,j,k 格式编写 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27405674/