【问题标题】:operator overloading in python [duplicate]python中的运算符重载[重复]
【发布时间】:2010-12-28 12:18:16
【问题描述】:

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

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

【问题讨论】:

  • 这可能是一个重复的问题,但我发现接受的答案比其他问题更有用,因为它链接到所有 __ xxx __ 方法的描述。
  • @ToolmakerSteve - 抱歉,我将其标记为不是答案并将其删除。它只不过是一个链接,这意味着它会受到链接腐烂。
  • 既然这是谷歌上的第一次点击,我认为它应该被解锁。锁定它会迫使人们额外点击以获取信息,下面的答案甚至没有给出示例。

标签: python operator-overloading


【解决方案1】:

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

类可以通过定义具有特殊名称的方法来实现由特殊语法调用的某些操作(例如算术运算或下标和切片)。这是 Python 的运算符重载方法,允许类根据语言运算符定义自己的行为。

【讨论】:

    【解决方案2】:

    正如其他答案所提到的,您确实可以重载运算符(通过在您正在编写的类中定义特殊方法,即名称以两个下划线开头和结尾的方法)。所有的细节都是here

    为了完成对您问题的回答:您不能定义新的运算符;但是<< 不是一个新的运算符,它是一个现有的运算符,并且通过在类中定义方法__lshift__ 来重载它。

    作为历史记录,这在 C++ 中也是如此——但您可以重载的确切运算符集在两种语言之间有所不同。例如,在 C++ 中,不能重载属性访问,.;在 Python 中,您可以使用__getattr__(或__getattribute__,具有不同的语义)和__setattr__。反之亦然,在 Python 中=(普通赋值)不是运算符,因此您不能重载它,而在 C++ 中它是运算符,您可以重载它。

    << 是一个运算符,并且可以在两种语言中被重载——这就是 <<>> 在不失去其左移和右移的初始内涵的同时,也成为了 I/O 格式化运算符C++(不是在 Python 中!-)。

    【讨论】:

    • +1 表示指向 __ xxx __ 方法列表的链接。我在其他问题的答案中找不到该链接,该问题被视为重复。
    【解决方案3】:

    是的,也不是。我不认为您可以定义自己的运算符,但您可以重载现有的运算符 - 您可以通过覆盖运算符的特殊方法来做到这一点。例如, 要覆盖 >,您可以覆盖 __gt__(),对于 != 覆盖 __ne__() 等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 2015-06-20
      • 2013-03-21
      • 2011-10-27
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多