Python中的运算符重载

45 投票
3 回答
74634 浏览
提问于 2025-04-15 17:13

可能的重复问题:
Python:如何定义我自己的运算符?
在Python中使用运算符重载的经验法则

在Python中,可以重载运算符吗?如果可以的话,能否定义新的运算符,比如 ++<<

3 个回答

4

是的,也不是。我觉得你不能自己定义新的运算符,但你可以重载(也就是修改)已有的运算符。你可以通过重写运算符的特殊方法来实现这一点。比如,要重写大于运算符(>),你可以重写 __gt__() 这个方法;要重写不等于运算符(!=),就重写 __ne__(),其他的也是类似的。

6

请查看:http://docs.python.org/reference/datamodel.html#special-method-names.

一个类可以通过定义一些特殊名称的方法,来实现某些操作,这些操作会通过特定的语法来调用,比如数学运算或者使用下标和切片。这就是Python处理运算符重载的方式,允许类根据语言运算符来定义自己的行为。

72

正如其他回答提到的,你确实可以重载运算符,也就是在你写的类里面定义一些特殊的方法,这些方法的名字都是以两个下划线开头和结尾的。具体的细节可以在这里找到。

为了回答你的问题:你不能定义新的运算符;但是<<并不是一个新的运算符,它是一个已经存在的运算符,你可以通过在类中定义方法__lshift__来重载它。

顺便提一下,这种情况在C++中也是差不多的——不过可以重载的运算符在这两种语言中是不同的。例如,在C++中,你不能重载属性访问,也就是.;而在Python中,你可以用__getattr__(或者__getattribute__,语义不同)和__setattr__来实现。反过来,在Python中,=(普通赋值)不是一个运算符,所以你不能重载它,而在C++中它是一个运算符,你可以重载它。

<<是一个运算符,在这两种语言中都可以重载——这就是为什么<<>>在C++中不仅保留了左移和右移的原始含义,还变成了输入输出格式化运算符(在Python中则不是!)。

撰写回答