运算符在python中重载

时间:2009-12-20 15:32:09

标签: python operator-overloading

  

可能重复:
  Python: defining my own operators?
  Rules of thumb for when to use operator overloading in python

是否可以在Python中重载运算符?如果是,可以定义新的运算符,例如++<<

3 个答案:

答案 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__()等等。