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 。 |
同样地,我们还有许多其他的神奇方法,例如类型转换神奇方法、字符串神奇方法、属性神奇方法、操作符神奇方法等等 –
链接
结论
通过示例,我们学习了本文中映射到神奇方法的一些运算符。在本文中,我们学习了神奇方法及其用法,以及一些神奇方法的运算符。