Python中的运算符重载
可能的重复问题:
Python:如何定义我自己的运算符?
在Python中使用运算符重载的经验法则
在Python中,可以重载运算符吗?如果可以的话,能否定义新的运算符,比如 ++
和 <<
?
3 个回答
是的,也不是。我觉得你不能自己定义新的运算符,但你可以重载(也就是修改)已有的运算符。你可以通过重写运算符的特殊方法来实现这一点。比如,要重写大于运算符(>),你可以重写 __gt__()
这个方法;要重写不等于运算符(!=),就重写 __ne__()
,其他的也是类似的。
请查看:http://docs.python.org/reference/datamodel.html#special-method-names.
一个类可以通过定义一些特殊名称的方法,来实现某些操作,这些操作会通过特定的语法来调用,比如数学运算或者使用下标和切片。这就是Python处理运算符重载的方式,允许类根据语言运算符来定义自己的行为。
正如其他回答提到的,你确实可以重载运算符,也就是在你写的类里面定义一些特殊的方法,这些方法的名字都是以两个下划线开头和结尾的。具体的细节可以在这里找到。
为了回答你的问题:你不能定义新的运算符;但是<<
并不是一个新的运算符,它是一个已经存在的运算符,你可以通过在类中定义方法__lshift__
来重载它。
顺便提一下,这种情况在C++中也是差不多的——不过可以重载的运算符在这两种语言中是不同的。例如,在C++中,你不能重载属性访问,也就是.
;而在Python中,你可以用__getattr__
(或者__getattribute__
,语义不同)和__setattr__
来实现。反过来,在Python中,=
(普通赋值)不是一个运算符,所以你不能重载它,而在C++中它是一个运算符,你可以重载它。
<<
是一个运算符,在这两种语言中都可以重载——这就是为什么<<
和>>
在C++中不仅保留了左移和右移的原始含义,还变成了输入输出格式化运算符(在Python中则不是!)。