如何在Python中使用类似C语言的自增++和自减--

本文介绍了如何在Python中利用魔术方法`__pos__`和`__neg__`为自增和自减操作提供自定义功能,以及如何通过扩展`__add__`方法实现类似C语言的逐次加法。作者还指出,这种实现方式改变了原操作的行为,如自增1变为自增0.5或1,取负数需显式表达。
摘要由CSDN通过智能技术生成

# 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)
输出

 测试,输出,运行,没毛病。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值