据说,Python 的对象天生拥有一些神奇的方法,他们总被双下划线锁包围,他们是面向对象的python的一切.
他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法的某一个,那么这个方法就会在特殊的情况下被python调用.
你可以定义自己想要的行为,而这一切都是自动发生的.
python 的魔术方法非常强大,然而随之而来的则是责任,了解正确的方法去使用非常重要.
魔术方法如下:
基本魔术方法
__new__(cls [....])
a.__new__
是在对象实例化的时候所调用的第一个方法
b. 他的第一个参数就是这个类,其他的参数就是用来直接传递给__init__
方法
c.__new__
决定是否使用该__init__
方法,因为__new__
可以调用其他类的构造方法或者直接返回别的实例化对象来作为本类的实例,如果__new__
没有返回实例对象,则__init__
不会被调用
d.__new__
主要是用于继承一个不可变的类型,不如一个tuple(元祖)或者string(字符串)__init__(self,[....])
构造器,当一个实例被创建的时候调用的初始化方法__del__(self)
析构器,当一个实例被销毁的时候调用分方法__call__(self,[...])
允许一个类的实例像函数一样被调用
a. 示例: x(a,b) 调用 x.__call__
(a,b)__len__(self)
定义当被len()
调用时的行为__repr__(self)
定义当被repr()
调用时的行为 将对象转化为供解释器读取的形式
s = '你好'
print(repr(s)) # '你好'
d = {'k':'v'}
print(repr(d)) # {'k': 'v'}
-
__str__(self)
定义当被 str() 调用时的行为 -
__bytes__(self)
定义当被 bytes() 调用时的行为 -
__hash__(self)
定义当被 hash() 调用时的行为 可哈希不可变,不可变可哈希 -
__bool__(self)
定义当被bool()
调用时的行为,返回True或者False -
__format__(self,format_spec)
定义当被 format() 调用时的行为主要用于字符串的格式化输出
有关属性
-
__getattr__(self,name)
定义当用户试图获取一个不存在的属性(反射,获取)
13.__getattrbute__(self,name)
定义当该类的属性被访问时的行为 -
__setattr__(self,name,value)
定义当一个属性被设置时的行为 -
__delattr__(self,name)
定义当一个属性被删除时的行为 -
__dir__(self,name)
定义当dir()
被调用时的行为 返回对象/模块的属性列表 -
__get__(self,instance,owner)
定义当前描述符的值被获取的行为 -
__set__(self,instance,value)
定义当前描述符的值被改变的行为 -
__delete__(self,instance)
定义当前描述符被删除时的行为
比较操作符
-
__lt__(self,other)
定义小于号的行为: x < y 调用 x.__lt__
(y) -
__le__(self,other)
定义小于等于号的行为: x <= y 调用 x.__le__
(y) -
__eq__(self,other)
定义等于号行为: x == y调用 x.__eq__
(y) -
__ne__(self,other)
定义不等于行为: x != y 调用 x.__ne__
(y) -
__gt__(self,other)
定义大于号行为: x > y 调用
x.__gt__
(y) -
__ge__(self,other)
定义大于等于行为: x >= y 调用 x.__ge__
(y)
算法运算符
-
__add__(self,other)
定义加法行为 + -
__sub__(self,other)
定义减法行为 - -
__mul__(self,other)
定义乘法行为 * -
__truediv__(self,other)
定义除法行为 / -
__floordiv__(self,other)
定义整除法行为 // -
__mod__(self,other)
定义取余算法行为 % -
__divmod__(self,other)
定义当被divmod()
调用时的行为
余商函数: 返回 商和余数
print(divmod(5,3)) # ( 1,2 ) 商1余2
-
__pow__(self,other,[ modulo ])
定义当被pow()
调用或 ** (乘方) 运算时的行为
print(pow(2,3)) # 8
print( 2 ** 3 ) # 8
-
__lshift__(self,other)
定义按位左移的行为 : << -
__rshift__(self,other)
定位按位右移的行为: >> -
__add__(self,other)
定义按位与操作行为:& -
__xor__(self,other)
定义按位异或操作行为:~ -
__or__(self,other)
定义按位或操作行为: |
反运算
-
__radd__(self,other)
与上方相同,当左操作不支持相应的操作时被调用 -
__rsub__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rmul__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rtruediv__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rfloordiv__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rmod__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rdivmod__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rpow__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rlshift__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rrshift__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__rxor__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用 -
__ror__(self,other)
与上方相同,当左操作数不支持相应的操作时被调用
增量赋值运算
-
__iadd__(self,other)
定义赋值加法的行为: += -
__isub__(self,other)
定义赋值减法的行为: -= -
__imul__(self,other)
定义赋值乘法的行为: *= -
__itruediv__(self,other)
定义赋值除法的行为: /= -
__ifloordiv__(self,other)
定义赋值整除的行为: //= -
__imod__(self,other)
定义赋值取余的行为: %= -
__ipow__(self.other, [...])
定义赋值幂运算行为: **= -
__ilshift__(self,other)
定义赋值按左位移动的行为: <<= -
__irshift__(self,other)
定义赋值按右位移移动的行为: >>= -
__iand__(self,other)
定义赋值 与操作的行为: &= -
__ixor__(self,other)
定义赋值异或操作的行为: ^= -
__ior__(self,other)
定义赋值或操作的行为: |=
一元操作符
-
__neg__(self)
定义正号行为: +x -
__pos__(self)
定义负号行为: -x -
__abs__(self)
定义当被abs()
调用时的行为返回数字的绝对值 -
__invert__(self)
定义按位求反的行为: ~x
类型转换
-
__complex__(self)
定义当被complex
调用时的行为 -
__int__(self)
定义当被int()
调用时的行为 -
__float__(self)
定义当被float()
调用时的行为 -
__round__(self, [ n ])
定义当被round()
调用时的行为 -
__index__(self)
- 当对象是被应用在切片表达式中,实现整形强制转换
- 如果你定义了一个可能在切片时候用到的定制的数值型,你应该定义
__index__
- 如果
__index__
被定义,则__int__
也需要被定义,且返回相同的值
上下文管理( with 语句 )
-
__enter__(self)
- 定义当使用
with
语句时的初始化行为 -
__enter__
的返回值被with
语句的目标或者as
后的名字绑定
- 定义当使用
-
__exit__(self,exc_type,exc_value,traceback)
- 定义当一个代码被执行或者终止后上下文管理器应该做什么
- 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作
容器类型
-
__len__(self)
定义当被len()
调用时的行为(返回容器中元素的个数) -
__getitem__(self,key)
定义获取容器中指定元素的行为,相当于 dict[key] 获取 value -
__setitem__(self,key,value)
定义设置容器中指定元素的行为,相当于 dict[key] = value -
__delitem__(self,key)
定义删除容器中指定元素的行为,相当于 del dict[key] -
__iter__(self)
定义当迭代容器中的元素行为
79.__reversed__(self)
定义当被reversed()
调用时的行为 -
__contains__(self,item)
定义使用成员测试运算符(in 或 not in)时的行为