# Python没有自加和自减运算符。
在翻阅Python魔术方法时,笔者发现Python虽然没有为++和--创建运算符,但python为正负运算创建了运算符。
比如:
a = +a
a = -a
一般来说,在原地写一个+a是没有任何作用的,但可以用魔术方法给赋予一个作用。
也就是给对象重写一个 __pos__ 和 __neg__。
class NewInt:
def __init__(self, val):
self.val = val
def __pos__(self):
# 支持自加
self.val += 1
return self
def __neg__(self):
# 支持自减
self.val -= 1
return self
def __str__(self):
# 支持print
return str(self.val)
a = NewInt(0)
++a
++a
--a
print(a)
在代码中,我们定义了一个NewInt对象,并为它重写了pos和neg魔术方法,并在下方定义了一个NewInt对象,测试,输出,完美!......吗?
那么,代价是什么呢?
首先,聪明的读者可能注意到了,这个方法每个加号就调用一次,所以实际上++a是a自加2 ,--a是a自减2。虽然我感觉这样好像功能更强了(++++++++++a #自加10),但如果想要和C语言的那种++的话,可以把代码中的每次加1改成每次加0.5,这样++就是自加1,自减同理。
其次,如果说正号本来就没什么用的话,那么负号的取负数作用被我们“完美”地覆盖掉了。所以我们在写取负数时得写成-1*a。当然你也可以写一个取反函数?
后话
值得一提的是,如果你像我那样在pos方法中定义了return的话,那么它甚至支持插在运算中。当然,那也得能运算,所以我们为NewInt添加一个加法。
class NewInt:
def __init__(self, val):
self.val = val
def __pos__(self):
self.val += 1
return self
def __neg__(self):
self.val -= 1
return self
def __add__(self, other):
self.val += other.val
return self
def __str__(self):
return str(self.val)
a = NewInt(0)
a = (++a) + NewInt(5)
print(a)
测试,输出,运行,没毛病。