Python 运算符被映射到哪些魔术方法

Python 运算符被映射到哪些魔术方法

在这篇文章中,我们将为您解释在Python中运算符被映射到哪些魔术方法。

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

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

示例

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

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__ 魔术方法运算符返回给定值的和。

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__()方法初始化该对象。

示例

# 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 类的实例时,将会得到上述的结果。

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

__str__() 方法

__str__() 是另一个重要的特殊方法。它被重写以返回用户定义类的可打印字符串表示。我们已经见过内置函数 str() ,它将对作为参数传递的对象返回一个字符串。

示例

# 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

同样地,我们还有许多其他的神奇方法,例如类型转换神奇方法、字符串神奇方法、属性神奇方法、操作符神奇方法等等 –

链接

结论

通过示例,我们学习了本文中映射到神奇方法的一些运算符。在本文中,我们学习了神奇方法及其用法,以及一些神奇方法的运算符。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程