【发布时间】:2010-10-20 23:03:26
【问题描述】:
是否可以在 Python 中重载 ++ 运算符?
【问题讨论】:
-
这是stackoverflow.com/questions/728361/… ..的副本吗?
-
..err,那你为什么要重载一个不存在的运算符..?
标签: python operator-overloading
是否可以在 Python 中重载 ++ 运算符?
【问题讨论】:
标签: python operator-overloading
不,不可能重载一元 ++ 运算符,因为它在 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。请注意,认为这可能会导致一些看起来很奇怪的代码。其他查看您的代码的人可能会认为这是一个无操作并且会感到困惑。
【讨论】:
Python 中没有++ 运算符(也没有'--')。递增通常使用 += 运算符代替。
【讨论】:
好吧,Python中不存在++运算符,所以你真的不能重载它。
当您执行以下操作时会发生什么:
1 ++ 2
其实是
1 + (+2)
【讨论】:
3() 不是函数。
3 ++ 4 应该是无效的,因为它是两个令牌像3 5 一样被混合在一起。但是,这有点误导,因为 Python 会根据上下文对加号标记进行不同的处理。但是,我要重申:++ 绝对不是运算符:请参阅语法 factor: ('+'|'-'|'~') factor | power 以及 factor 在 compiler/transformer.py 中的处理方式。另请参阅 Jake 的 hack。
每个人都提出了很好的观点,我只想澄清另一件事。打开 Python 解释器并检查一下:
>>> i = 1
>>> ++i
1
>>> i
1
Python 中没有 ++(或 --)运算符。它表现得如此(而不是语法错误)的原因是 + 和 - 是有效的一元运算符,基本上就像数字上的符号一样。您可以将++i 视为“+(+i)”,将--i 视为“-(-i)”。期望++i 像使用任何其他语言一样工作会导致绝对阴险的错误搜索。 C 程序员:请注意。
一个直接的i++ 或i-- 确实失败了,不管它的价值。
【讨论】:
你可以破解它,尽管这会带来一些不良后果:
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
【讨论】: