在 Python 中,操作符是如何映射到魔法方法的?


在本文中,我们将向您解释 Python 中的操作符是如何映射到魔法方法的。

Python 的魔法方法是特殊的方法,它们以双下划线开头和结尾。它们也被称为dunder方法。魔法方法不打算由您直接调用,而是由类在特定操作时调用。当您使用 + 操作符将两个数字相加时,__add__() 方法会在内部被调用。

Python 中的许多魔法方法都是由内置类定义的。要获取类继承的魔法方法的数量,请使用dir() 函数。

示例

以下程序列出了在int 类中定义的所有属性和方法。

Open Compiler
print(dir(int))

输出

执行后,以上程序将生成以下输出:

['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', 
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', 
'__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', 
'__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', 
'__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', 
'__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', 
'__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', 
'__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', 
'__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 
'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

这里,int 类包含许多用双下划线包围的魔法方法。

__add__ 方法

__add__ 方法是当我们使用+ 操作符将两个值相加时调用的魔法方法。1. 在 Python 中,操作符是如何映射到魔法方法的?

示例

以下程序使用魔法方法的__add__ 方法操作符返回给定值与一个值的和:

Open Compiler
n = 20 # adding 10 to input number using + sign print("Addition using + sign:", n + 10) # adding 10 to input number using __add__ method # by passing the value to be added as an argument print("Addition using __add__ method:", n.__add__(10))

输出

执行后,以上程序将生成以下输出:

Addition using + sign: 30
Addition using __add__ method: 30

正如您所看到的,当您输入 n+10 时,+ 操作符会调用__add__(10) 方法。您也可以显式地调用n.__add__(10) 来获得相同的结果。但是,如前所述,魔法方法并非旨在直接调用,而是通过其他方法或操作间接调用。

在 Python 中,魔法方法最常用于定义预定义操作符的重载行为。例如,算术运算符默认情况下对数字操作数进行运算。这意味着必须将数字对象与诸如 +、-、*、/ 等运算符结合使用。在字符串、列表和元组类中,+ 操作符也被指定为连接运算符。+ 操作符被称为重载。

要在您自己的自定义类中使用重载行为,请覆盖相应的魔法方法。例如,要将 + 操作符与用户定义类的对象一起使用,它必须包含__add__() 方法。

__new__() 方法

要创建类的新的实例,Java 和 C# 等语言使用 new 操作符。在 Python 中,__new__() 魔法方法在__init__() 方法之前隐式调用。__new__() 方法返回一个新对象,随后使用__init__() 方法对其进行初始化。

示例

Open Compiler
# defining a class class Tutorialspoint: def __new__(democlass): print ("calling __new__ magic method") instance = object.__new__(democlass) return instance def __init__(self): print ("calling __init__ magic method") self.author ='XYZ' # calling the above-defined Tutorialspoint class result = Tutorialspoint()

输出

执行后,以上程序将生成以下输出:

calling __new__ magic method
calling __init__ magic method

在这里,当您创建Tutorialspoint 类的实例时,您将获得上述结果。

因此,__new__() 方法在__init__() 方法之前调用。

Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.

__str__() 方法

__str__() 是另一个重要的魔法方法。它被重写以返回任何用户定义类的可打印字符串表示形式。我们已经看到了内置函数str(),它从作为参数传递的对象返回一个字符串。

示例

Open Compiler
# input number n = 10 # printing the string form of a number using str() print(str(n)) # printing the string form of a number using __str__() magic method # Both are equivalent print(int.__str__(n))

输出

执行后,以上程序将生成以下输出:

10
10

这里,str(10) 返回值“10”。当被调用时,它会调用 int 类的__str__() 方法。

并且str() 函数在内部调用在类中定义的__str__() 方法。因此,它被称为魔法方法!

重要的魔法方法

下表列出了 Python 3 中最重要的魔法方法。

初始化和构造 描述
__new__(cls, other) 在对象实例化时调用。
__init__(self, other) 由 __new__ 方法调用。
__del__(self) 析构方法。
一元运算符和函数 描述
__pos__(self) 对一元正数调用,例如:+someobject。
__neg__(self) 对一元负数调用,例如:-someobject。
__abs__(self) 由内置 abs() 函数调用。
__invert__(self) 使用 ~ 操作符进行反转时调用。
__round__(self,n) 由内置 round() 函数调用。
__floor__(self) 由内置 math.floor() 函数调用。
__ceil__(self) 由内置 math.ceil() 函数调用。
__trunc__(self) 由内置 math.trunc() 函数调用。
增强赋值 描述
__iadd__(self, other) 在带赋值的加法运算中调用,例如:a +=b。
__isub__(self, other) 在带赋值的减法运算中调用,例如:a -=b。
__imul__(self, other) 在带赋值的乘法运算中调用,例如:a *=b。
__ifloordiv__(self, other) 在带赋值的整数除法运算中调用,例如:a //=b。
__idiv__(self, other) 在带赋值的除法运算中调用,例如:a /=b。
__itruediv__(self, other) 在带赋值的真除法运算中调用
__imod__(self, other) 在带赋值的取模运算中调用,例如:a%=b。
__ipow__(self, other) 在带赋值的幂运算中调用,例如:a **=b。
__ilshift__(self, other) 在带赋值的左移位运算中调用,例如:a<<=b。
__irshift__(self, other) 在带赋值的右移位运算中调用,例如:a >>=b。
__iand__(self, other) 在带赋值的按位与运算中调用,例如:a&=b。
__ior__(self, other) 在带赋值的按位或运算中调用,例如:a|=b。
__ixor__(self, other) 在带赋值的按位异或运算中调用,例如:a ^=b。

类似地,我们还有许多其他魔法方法,例如类型转换魔法方法、字符串魔法方法、属性魔法方法、操作符魔法方法等 - 链接

结论

在本文中,我们通过示例了解了一些映射到魔法方法的操作符。在本文中,我们学习了魔法方法及其使用方法,以及魔法方法的一些操作符。

更新于:2022年11月9日

350 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告