Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写一个PythonC类型,想写一个乘法运算符_Python_Cpython - Fatal编程技术网

写一个PythonC类型,想写一个乘法运算符

写一个PythonC类型,想写一个乘法运算符,python,cpython,Python,Cpython,我正在用C为Python编写一个特殊的数字类型作为扩展,我想为它提供一个专门的二进制乘法运算符 static PyMethodDef pyquat_Quat_methods[] = { {"__mul__", (PyCFunction)pyquat_Quat_mul, METH_O, "multiply unit quaternion by another using the Hamiltonian definition"}, {NULL, NULL, 0, NULL} /* Sent

我正在用C为Python编写一个特殊的数字类型作为扩展,我想为它提供一个专门的二进制乘法运算符

static PyMethodDef pyquat_Quat_methods[] = {
  {"__mul__", (PyCFunction)pyquat_Quat_mul, METH_O, "multiply unit quaternion by another using the Hamiltonian definition"},
  {NULL, NULL, 0, NULL}  /* Sentinel */
};
如果我随后编译并加载库,我就可以成功地创建名为x和y的对象实例。我甚至能做到

w = x.__mul__(y)
但是如果我试着去做

w = x * y
我得到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'pyquat.Quat' and 'pyquat.Quat'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:不支持*:“pyquat.Quat”和“pyquat.Quat”的操作数类型

我是否需要告诉Python将
\uuuuuuuuuuuuuuuuuuu
视为二进制乘法运算符?

如果希望用C编写的类型支持乘法,则需要提供一个用于乘法的
nb\u乘法
函数,并且不需要显式提供
\uuuuuuuuuuuuuuuuuuu
方法<代码>\uuuu mul\uuuu将为您处理。查看一下可能会有所帮助。

如果希望用C编写的类型支持乘法,则需要提供一个用于乘法的
nb\u multiply
函数,并且不需要显式提供
\uu mul\uu
方法<代码>\uuuu mul\uuuu将为您处理。查看。

重载运算符似乎在类中是可能的,因此,例如,类的两个对象之间的+可以使用类中的uMul_uuu和add_uuu(必须在uu或double u之间添加空格作为粗体格式)方法定义来定义,请参阅。顺便说一句,我所做的只是搜索python操作符重载,这是最重要的答案。另请参见@barny-re:formatting。尝试添加反勾号:
“\uuuuMul\uuuuuuu”
doh知道这在答案中起作用,但从未在注释中尝试过。谢谢@巴尼:这是提问者已经尝试过的,但没有成功,因为C API重载运算符的方式是不同的。重载运算符似乎在类中是可能的,因此,例如,.+在类的两个对象之间可以使用mul_uu和add_u来定义(必须将u或双精度u之间的空格添加为粗体格式)类中的方法定义,请参见。顺便说一句,我所做的只是搜索python运算符重载,这是最重要的答案。另请参见@barny-re:formatting。尝试添加backticks:
“\uuuu mul\uuuuu`
doh知道答案中的方法有效,但从未在注释中尝试过。谢谢!@barny:提问者已经尝试过这种方法,但没有成功,因为C API重载运算符的方式是不同的。因此,如果“mul将为您处理”-我猜您的意思是您将一个指针放在乘法(以及所有其他运算符函数)上在
PyNumberMethods
结构中。@barny:提供一个
tp\u as\u number
字段,该字段带有指向乘法和其他方法的指针,Python将为您设置
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。因此,如果“mul将为您处理”-我猜您的意思是将指针放在乘法(和所有其他运算符函数)上在
PyNumberMethods
结构中。@barny:提供一个
tp\u as\u number
字段,该字段带有指向乘法和其他方法的指针,Python将为您设置
\uuuuuuuuuu