前言
python 有众多的魔法方法, 它们会在满足某种条件下触发执行, 掌握好魔法方法的使用, 可以加快程序的运行效率, 同时减少逻辑调用.
关键字与魔法方法
python 的一些魔法方法是关键字触发的, 即 python 解释器遇到某个关键字就会去执行相应的魔法方法.
del 与__del__
如果一个对象定义了__del__魔法方法, 那么解释器会调用 del 关键字后对象的__del__魔法方法, 然后在上下文中删除该对象.
- class Dog(object):
- def __init__(self):
- pass
- def __del__(self):
- print('delete the dog object')
- dog = Dog()
- del dog
with 与__enter__,__exit__
如果一个类实现了_enter_,__exit__魔法方法, 我们就说这个类实现了一个上下文管理器, 它使用 with 关键字触发, 更多的用法参考: python 之上下文管理器
if 与__bool__
一个对象定义了__bool__魔法方法后, if 关键字会触发该魔法方法, 如果没有定义就会使用解释器预置的处理算法.
- class List(list):
- def __bool__(self):
- print('list bool')
- return True
- if __name__ == "__main__":
- ls = List([])
- if ls: # 为真
- print('mmm')
in\not in 与__contains__
当使用 in 或 not in 关键字判断一个容器里的元素时, 触发该容器的_contains_, 如果没有定义, Python 就会迭代整个序列.
- class MyList(list):
- def __contains__(self, item):
- print('__contains__')
- return super().__contains__(item)
- if __name__ == "__main__":
- my = MyList([1,2,3])
- if 1 in my:
- pass
运算符与魔法方法
python 像大多数编程语言一样有那么多的运算符, 为什么哪些运算符有着相应的功能呢? 答案就在于运算符会触发相应的魔法方法.
python 的运算符有算术运算符, 逻辑运算符, 比较运算符等:
算术运算符与魔法方法
+: 数值相加, 会调用相加对象的__add__或__radd__方法.
- class Int(int):
- def __add__(self, other):
- print('diao yong le add')
- return super().__add__(other)
- def __radd__(self, other):
- print('diao yong le radd')
- return super().__radd__(other)
- if __name__ == "__main__":
- a = Int(3)
- b = Int(5)
- c = a + b # 发现__add__方法被调用了
- c = 3 + a # 方法__radd__方法被调用了, 只有当操作符左边的参数没有定义__add__方法,__radd__方法才会被调用.
我们可以通过重写相关的方法重新定义 "+" 符号的功能.
同理算术运算符的魔法方法:
a+b: 数值相加, 会调用对象的 \__add\__或 \__radd__方法.
a-b: 数值相减, 会调用对象的__rsub__或__sub__方法
a*b: 数值相乘, 调用__mul__和__rmul__方法
a/b: 数值相除, 调用__rtruediv__和__truediv__方法
a//b: 整除, 调用__floordiv__和__rfloordiv__方法.
a%b: 求余, 调用__mod__和__rmod__方法
a**b: 求幂, 调用__pow__和__rpow__方法;
-a: 求负数, 调用__neg__方法;
+a: 调用__pos__方法
赋值运算符与魔法方法
a=b:
a+=b:a 与 b 相加赋值给 a, 调用__iadd__方法;
a-=b:a 与 b 相减赋值给 a, 调用__isub__方法;
a*=b:a 与 b 相乘赋值给 a, 调用__imul__方法;
a/=b:a 与 b 相除赋值给 a, 调用__itruediv__方法;
a%=b:a 与求余赋值给 a, 调用__imod__方法;
a//=b:a 与 b 整除赋值给 a, 调用__ifloordiv__方法;
a**=b:a 与 b 求幂赋值给 a, 调用__ipow__方法;
a&=b:a 与 b 位与运算赋值给 a, 调用__iand__方法;
a|=b:a 与 b 位或运算赋值给 a, 调用__ior__方法;
a^=b:a 与 b 位异或运算赋值给 a, 调用__ixor__方法;
比较运算符与魔法方法
\>: 大于, 比较大小返回布尔值, 调用比较参数的 \__gt__方法
>=: 大于等于, 调用比较参数的 \__ge__方法
<: 小于, 调用比较参数的 \__lt__方法
<=: 小于等于, 调用比较参数的 \__le__方法
==: 等于, 调用比较参数的__eq__方法
!=: 不等于, 调用比较参数的__ne__方法
位运算符与魔法方法
位运算符是将数字当做位来运算.
- a = 10 # 位 a = 0000 1010
- b = 15 # b = 0000 1111
- c = a&b # c = 0000 1010
- print(c) # 10
相应的魔法方法:
|: 或, 调用比较参数的__or__和__ror__方法
&: 与, 调用比较参数的__and__和__rand__方法
~: 取反, 调用比较参数的__invert__方法
<<: 左移位运算, 调用比较参数的__lshift__和__rlshift__方法
>>: 右移动运算符, 调用比较参数的__rrshift__和__rshift__方法
^: 异或运算, 调用比较参数的__rxor__和__xor__方法
来源: https://www.cnblogs.com/cwp-bg/p/9856065.html