python - 是否可以用 i,j,k 格式编写 vector ?

标签 python c python-internals

我知道可以做类似的事情

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/

相关文章:

Python Selenium + Datepicker 问题

c - 按位移位 (var Uint8 >> 7) & 0x01u - Misra 兼容

c - 读取文件时 "bypass"如何控制字符?

python - "del"究竟做了什么?

Python 方法访问器在每次访问时创建新对象?

python - Python 编译器如何使用声明的编码预处理源文件?

python - 两个列表中元素的组合

python - matplotlib 3d 回到 2d

python - 使用 argparse 解析字符串

c - 添加到双向链表的头部