我知道可以做类似
的事情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版本,除了学术之旅之外,这将是疯狂的事情),但只是出于对语言如何运作的好奇心。
答案 0 :(得分:1)
您可以编写一个继承自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 '
你可能在这里注意到一个明显的问题:实际的向量是self.vec,而不是对象本身,所以你必须在self.vec属性上完成所有的numpy操作。这样做的原因是numpy数组的编写方式使它们难以子类化(c.f。this question about subclassing C exentsions)。通常,使用以下命令初始化数组:
>>>> import numpy
>>>> numpy.ndarray(vector)
问题是np.array实际上并不是一个类,而是numpy.ndarray类的工厂函数,它以不同的方式初始化,很少使用。你不能让一个对象从一个函数继承方法,所以继承并不简单。