类的魔法方法实质是 python 的内置方法,不需要主动调用。当我们在进行某种类的运算或操作时,python的解释器会自动调用相应的魔法方法。
类的魔法方法总是被双下划线所包围,一般格式为:"__ 方法名__",它们功能强大,充满魔力。通过重载,魔术方法的实际功能可以根据实际需要进行更改。例如: __ init__() 就是一个典型的魔法方法,当创建对象时会被系统调用,在定义类时,也可以根据需要设置它的实际功能。
一、基本魔法方法
x.__ init__() ———— 创建对象后:MyObj = MyClass()
x.__ repr__() ———— repr(x)
x.__ str__() ———— str(x)
x.__ bytes__() ———— bytes(x)
x.__ format__(format_spec) ———— format(x, format_spec)
seq.__ iter__() ———— iter(seq)
seq.__ next__() ———— next(seq)
seq.__ reversed__() ———— reversed(seq)
x.__ getattribute__(‘my_property’) ———— x.my_property
x.__ getattr__(‘my_property’) ———— x.my_property
x.__ setattr__(‘my_property’, value) ———— 设置一个属性:x.my_property = value
x.__ delattr__(‘my_property’) ———— del x.my_property
x.__ dir__() ———— dir(x)
my_instance.__ call__() ———— "调用"像函数一样的实例:my_instance()
s.__ len__() ———— len(s)
s.__ contains__(s) ———— 否包含特定的值:x in s
x.__ getitem__(key) ———— x[key]
x.__ setitem__(key, value) ———— 通过key来设置一个值:x[key] = value
x.__ delitem__(key) ———— del x[key]
x.__ missing__(nonexistent_key) ———— 为丢失的key提供默认值:x[nonexistent_key]
二、运算魔法方法
x.__ add__(y)、x.__ radd__(y) ———— x + y
x.__ sub__(y)、x.__ rsub__(y) ———— x - y
x.__ mul__(y)、x.__ rmul__(y) ———— x * y
x.__ trueiv__(y)、x.__ rtrueiv__(y) ———— x / y
x.__ floordiv__(v)、x.__ rfloordiv__(v) ———— x // y
x.__ mod__(y)、x.__ rmod__(y) ———— x % y
x.__ divmod__(y)、x.__ rdivmod__(y) ———— divmod(x, y)
x.__ pow__(y)、x.__ rpow__(y) ———— x ** y
x.__ lshift__(y)、x.__ rlshift__(y) ———— x << y
x.__ rshift__(y)、x.__ rrshift__(y) ———— x >> y
x._ and_(y)、x.__ rand__(y) ———— 按位与运算:x & y
x.__ or__(y)、x.__ ror__(y) ———— 按位或运算:x | y
x.__ xor__(y)、x.__ rxor__(y) ———— 按位异或运算:x ^ y
前缀“r”有与无的区别,以加法 x+y 为例:
1、x 有 __ add__ 方法,且不返回 NotImplemented,则调用x.__ add__(y)。
2、x 没有 __ add__ 方法,或者调用 __ add__ 方法返回 NotImplemented,则检查 y 有没有 __ radd__ 方法,如果有,且不返回 NotImplemented,则调用 y.__ radd__(x)。
3、x 没有 __ add__ 方法,或者调用 __ add__ 方法返回 NotImplemented,且 y 也没有 __ radd__ 方法, 或者调用 __ radd__ 方法返回 NotImplemented,则抛出 TypeError异常。
x.__ iadd__(y) ———— x += y
x.__ isub__(y) ———— x -= y
x.__ imul__(y) ———— x *= y
x.__ itrueiv__(y) ———— x /= y
x.__ ifloordiv__(v) ———— x //= y
x.__ imod__(y) ———— x %= y
x.__ idivmod__(y) ———— 整除与取余:x= divmod(x, y)
x.__ ipow__(y) ———— x **= y
x.__ ilshift__(y) ———— x <<= y
x.__ irshift__(y)