可能重复:
Python: defining my own operators?
Rules of thumb for when to use operator overloading in python
是否可以在Python中重载运算符?如果是,可以定义新的运算符,例如++
和<<
?
答案 0 :(得分:71)
正如其他答案所提到的,你确实可以重载运算符(通过定义你正在编写的类中的特殊方法,即名称以两个下划线开头和结尾的方法)。所有细节都是here。
要完成问题的答案:您无法定义新的运算符;但是<<
不是一个新的运算符,它是一个现有运算符,并且通过在类中定义方法__lshift__
来重载它。
作为一个历史记录,这也是C ++中的情况 - 但是你可以重载的确切运算符集在两种语言之间有所不同。例如,在C ++中,您不能重载属性访问权限.
;在Python中,您可以使用__getattr__
(或__getattribute__
,具有不同的语义)和__setattr__
。反之亦然,在Python中=
(普通赋值)不是运算符,所以你不能重载它,而在C ++中它是一个运算符,你可以重载它。
<<
是一个运算符,并且可以用两种语言重载 - 这就是<<
和>>
的方式,同时又没有失去左右移位的初始内涵,也变成了C ++中的I / O格式化运算符(不是Python! - 。)。
答案 1 :(得分:6)
请参阅:http://docs.python.org/reference/datamodel.html#special-method-names。
类可以通过定义具有特殊名称的方法来实现由特殊语法(例如算术运算或下标和切片)调用的某些操作。这是Python的运算符重载方法,允许类根据语言运算符定义自己的行为。
答案 2 :(得分:4)
是的,不。我不认为你可以定义自己的运算符,但是你可以重载现有的运算符 - 你可以通过覆盖运算符的特殊方法来实现。例如,
要覆盖&gt;,您可以覆盖__gt__()
,对于!=覆盖__ne__()
等等。