【问题标题】:Is it possible to overload ++ operators in Python?是否可以在 Python 中重载 ++ 运算符?
【发布时间】:2010-10-20 23:03:26
【问题描述】:

是否可以在 Python 中重载 ++ 运算符?

【问题讨论】:

标签: python operator-overloading


【解决方案1】:

不,不可能重载一元 ++ 运算符,因为它在 Python 中根本不是运算符。

只有 Python 语法允许的运算符(其子集)(在该语言中已经有一个或多个用途的运算符)可能会被重载。

These 是有效的 Python 运算符,this page 列出了您可以定义以重载它们的方法(带有两个前导和尾随下划线的方法)。

与其他语言中常用的 i++ 不同,Python 中写为 i += 1。

在python中,+号需要一个操作数在它的右边。它可能在其左侧还有一个操作数,在这种情况下,它将被解释为二元运算符而不是一元运算符。 +5, ++5, ..., ++++++5 都是有效的 Python 表达式(所有计算结果都为 5),7 + 5, 7 ++ 5, ..., 7 ++++ ++++ 5(全部计算为 7 + (+...+5) = 12)。 5+ 是 not 有效的 Python。另见this question

另一种想法:根据您实际想要使用 ++ 运算符的目的,您可能需要考虑重载 unary (prefix) plus operator。请注意,认为这可能会导致一些看起来很奇怪的代码。其他查看您的代码的人可能会认为这是一个无操作并且会感到困惑。

【讨论】:

    【解决方案2】:

    Python 中没有++ 运算符(也没有'--')。递增通常使用 += 运算符代替。

    【讨论】:

      【解决方案3】:

      好吧,Python中不存在++运算符,所以你真的不能重载它。

      当您执行以下操作时会发生什么:

      1 ++ 2

      其实是

      1 + (+2)

      【讨论】:

      • Edward Z. Yang:那是因为它试图调用一个函数。 3() 不是函数。
      • 原来的观点是,如果它是一个右绑定的一元运算符,3 ++ 4 应该是无效的,因为它是两个令牌像3 5 一样被混合在一起。但是,这有点误导,因为 Python 会根据上下文对加号标记进行不同的处理。但是,我要重申:++ 绝对不是运算符:请参阅语法 factor: ('+'|'-'|'~') factor | power 以及 factorcompiler/transformer.py 中的处理方式。另请参阅 Jake 的 hack。
      【解决方案4】:

      每个人都提出了很好的观点,我只想澄清另一件事。打开 Python 解释器并检查一下:

      >>> i = 1
      >>> ++i
      1
      >>> i
      1
      

      Python 中没有 ++(或 --)运算符。它表现得如此(而不是语法错误)的原因是 + 和 - 是有效的一元运算符,基本上就像数字上的符号一样。您可以将++i 视为“+(+i)”,将--i 视为“-(-i)”。期望++i 像使用任何其他语言一样工作会导致绝对阴险的错误搜索。 C 程序员:请注意。

      一个直接的i++i-- 确实失败了,不管它的价值。

      【讨论】:

        【解决方案5】:

        你可以破解它,尽管这会带来一些不良后果:

        class myint_plus:
            def __init__(self,myint_instance):
                self.myint_instance = myint_instance
        
            def __pos__(self):
                self.myint_instance.i += 1
                return self.myint_instance
        
        class myint:
            def __init__(self,i):
                self.i = i
        
            def __pos__(self):
                return myint_plus(self)
        
            def __repr__(self):
                return self.i.__repr__()
        
        
        x = myint(1)
        print x
        ++x
        print x
        

        输出是:

        1
        2
        

        【讨论】:

          猜你喜欢
          • 2015-01-01
          • 2012-09-04
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          • 2012-01-12
          • 2017-05-06
          • 2023-04-05
          相关资源
          最近更新 更多