📜  Python中的运算符重载

📅  最后修改于: 2020-01-17 11:33:48             🧑  作者: Mango

运算符重载意味着提供超出其预定义操作含义的扩展含义。例如,运算符+用于添加两个整数以及连接两个字符串并合并两个列表。这是可以实现的,因为int类和str类会重载’+’运算符。您可能已经注意到,相同的内置运算符或函数对不同类的对象显示不同的行为,这称为运算符重载

# Python程序,展示运算符的重载
print(1 + 2)
# 两个string相加
print("芒果"+"For")
# 两个数的乘积
print(3 * 4)
# 重复字符串
print("芒果"*4)

输出:

3
芒果For
12
芒果芒果芒果芒果

如何在Python中重载运算符
考虑到我们有两个对象,并且必须使用二进制“ +”运算符添加两个对象,这会引发错误,因为编译器不知道如何添加两个对象。因此,我们为运算符定义了一种方法,该过程称为运算符重载。
我们可以重载所有现有的运算符,但不能创建新的运算符。为了执行运算符重载,Python提供了一些特殊的函数或魔术函数,当与该特定的运算符相关联时,这些函数会自动调用。例如,当我们使用+运算符时,__add__将自动调用magic方法,其中定义了+运算符的操作。
在Python中重载Binary +运算符:
当我们对用户定义的数据类型使用运算符时,会自动调用与该运算符关联的特殊函数或魔术函数。更改运算符的行为就像更改方法或函数的行为一样简单。您可以在类中定义方法,并且运算符将根据方法中定义的行为进行工作。当我们使用+运算符时,__add__会自动调用magic方法,其中定义了+运算符的操作。通过更改此魔术方法的代码,我们可以为+运算符赋予其他含义。
代码1:

# Python程序,展示重载Binary +运算符
class A:
    def __init__(self, a):
        self.a = a
    # 两个对象相加
    def __add__(self, o):
        return self.a + o.a
ob1 = A(1)
ob2 = A(2)
ob3 = A("芒果")
ob4 = A("For")
print(ob1 + ob2)
print(ob3 + ob4)

输出:

3
芒果For

代码2:

# Python程序,展示如何使用+运算符重载计算两个复数的和
class complex:
    def __init__(self, a, b):
        self.a = a
        self.b = b
     # 两个对象相加
    def __add__(self, other):
        return self.a + other.a, self.b + other.b
    def __str__(self):
        return self.a, self.b
Ob1 = complex(1, 2)
Ob2 = complex(2, 3)
Ob3 = Ob1 + Ob2
print(Ob3)

输出:

(3、5)

重载Python中的比较运算符:

# 重载Python中的比较运算符
class A:
    def __init__(self, a):
        self.a = a
    def __gt__(self, other):
        if(self.a>other.a):
            return True
        else:
            return False
ob1 = A(2)
ob2 = A(3)
if(ob1>ob2):
    print("ob1大于ob2")
else:
    print("ob2大于ob1")

输出:

ob2大于ob1

重载相等且小于运算符:

# Python重载相等且小于运算符
class A:
    def __init__(self, a):
        self.a = a
    def __lt__(self, other):
        if(self.a

输出:

ob1小于ob2
相等

Python魔术方法或用于运算符重载的特殊函数

二元运算符:

运算符 魔术方法
+ __add __(自己,其他)
__sub __(自己,其他)
* __mul __(其他)
/ __truediv __(自己,其他)
// __floordiv __(自己,其他)
__mod __(自己,其他)
** __pow __(自己,其他)

比较运算符:

运算符 魔术方法
< __lt __(自己,其他)
> __gt __(自己,其他)
<= __le __(自己,其他)
> = __ge __(自己,其他)
== __eq __(自己,其他)
!= __ne __(自己,其他)

分配运算符:

运算符 魔术方法
-= __isub __(自己,其他)
+ = __iadd __(自己,其他)
* = __imul __(自己,其他)
/ = __idiv __(自己,其他)
// = __ifloordiv __(自己,其他)
%= __imod __(自己,其他)
** = __ipow __(自己,其他)

一元运算符:

运算符 魔术方法
__neg __(自己,其他)
+ __pos __(自己,其他)
__invert __(自己,其他)