类中的双下滑线方法(魔术方法)

据说,Python 的对象天生拥有一些神奇的方法,他们总被双下划线锁包围,他们是面向对象的python的一切.
他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法的某一个,那么这个方法就会在特殊的情况下被python调用.
你可以定义自己想要的行为,而这一切都是自动发生的.
python 的魔术方法非常强大,然而随之而来的则是责任,了解正确的方法去使用非常重要.

魔术方法如下:

基本魔术方法

  1. __new__(cls [....])
    a. __new__是在对象实例化的时候所调用的第一个方法
    b. 他的第一个参数就是这个类,其他的参数就是用来直接传递给__init__方法
    c. __new__决定是否使用该 __init__方法,因为__new__可以调用其他类的构造方法或者直接返回别的实例化对象来作为本类的实例,如果__new__没有返回实例对象,则__init__不会被调用
    d. __new__主要是用于继承一个不可变的类型,不如一个tuple(元祖)或者string(字符串)

  2. __init__(self,[....]) 构造器,当一个实例被创建的时候调用的初始化方法

  3. __del__(self) 析构器,当一个实例被销毁的时候调用分方法

  4. __call__(self,[...]) 允许一个类的实例像函数一样被调用
    a. 示例: x(a,b) 调用 x.__call__(a,b)

  5. __len__(self) 定义当被 len() 调用时的行为

  6. __repr__(self)定义当被repr()调用时的行为 将对象转化为供解释器读取的形式

s = '你好'
print(repr(s))    # '你好'
d = {'k':'v'}
print(repr(d))  # {'k': 'v'}
  1. __str__(self) 定义当被 str() 调用时的行为
  2. __bytes__(self) 定义当被 bytes() 调用时的行为
  3. __hash__(self)定义当被 hash() 调用时的行为 可哈希不可变,不可变可哈希
  4. __bool__(self)定义当被 bool() 调用时的行为,返回True或者False
  5. __format__(self,format_spec) 定义当被 format() 调用时的行为主要用于字符串的格式化输出

有关属性

  1. __getattr__(self,name) 定义当用户试图获取一个不存在的属性(反射,获取)
    13.__getattrbute__(self,name)定义当该类的属性被访问时的行为
  2. __setattr__(self,name,value) 定义当一个属性被设置时的行为
  3. __delattr__(self,name) 定义当一个属性被删除时的行为
  4. __dir__(self,name) 定义当 dir() 被调用时的行为 返回对象/模块的属性列表
  5. __get__(self,instance,owner) 定义当前描述符的值被获取的行为
  6. __set__(self,instance,value) 定义当前描述符的值被改变的行为
  7. __delete__(self,instance) 定义当前描述符被删除时的行为

比较操作符

  1. __lt__(self,other) 定义小于号的行为: x < y 调用 x.__lt__(y)
  2. __le__(self,other) 定义小于等于号的行为: x <= y 调用 x.__le__(y)
  3. __eq__(self,other) 定义等于号行为: x == y调用 x.__eq__(y)
  4. __ne__(self,other) 定义不等于行为: x != y 调用 x.__ne__(y)
  5. __gt__(self,other) 定义大于号行为: x > y 调用
    x.__gt__(y)
  6. __ge__(self,other)定义大于等于行为: x >= y 调用 x.__ge__(y)

算法运算符

  1. __add__(self,other) 定义加法行为 +
  2. __sub__(self,other) 定义减法行为 -
  3. __mul__(self,other) 定义乘法行为 *
  4. __truediv__(self,other) 定义除法行为 /
  5. __floordiv__(self,other) 定义整除法行为 //
  6. __mod__(self,other) 定义取余算法行为 %
  7. __divmod__(self,other) 定义当被 divmod() 调用时的行为
余商函数: 返回 商和余数
print(divmod(5,3))  # ( 1,2 ) 商1余2
  1. __pow__(self,other,[ modulo ]) 定义当被 pow() 调用或 ** (乘方) 运算时的行为
print(pow(2,3))  # 8
print( 2 ** 3 )     # 8
  1. __lshift__(self,other) 定义按位左移的行为 : <<
  2. __rshift__(self,other) 定位按位右移的行为: >>
  3. __add__(self,other) 定义按位与操作行为:&
  4. __xor__(self,other) 定义按位异或操作行为:~
  5. __or__(self,other) 定义按位或操作行为: |

反运算

  1. __radd__(self,other) 与上方相同,当左操作不支持相应的操作时被调用
  2. __rsub__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  3. __rmul__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  4. __rtruediv__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  5. __rfloordiv__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  6. __rmod__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  7. __rdivmod__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  8. __rpow__(self,other)与上方相同,当左操作数不支持相应的操作时被调用
  9. __rlshift__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  10. __rrshift__(self,other)与上方相同,当左操作数不支持相应的操作时被调用
  11. __rxor__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用
  12. __ror__(self,other) 与上方相同,当左操作数不支持相应的操作时被调用

增量赋值运算

  1. __iadd__(self,other) 定义赋值加法的行为: +=
  2. __isub__(self,other) 定义赋值减法的行为: -=
  3. __imul__(self,other) 定义赋值乘法的行为: *=
  4. __itruediv__(self,other) 定义赋值除法的行为: /=
  5. __ifloordiv__(self,other) 定义赋值整除的行为: //=
  6. __imod__(self,other) 定义赋值取余的行为: %=
  7. __ipow__(self.other, [...]) 定义赋值幂运算行为: **=
  8. __ilshift__(self,other) 定义赋值按左位移动的行为: <<=
  9. __irshift__(self,other)定义赋值按右位移移动的行为: >>=
  10. __iand__(self,other) 定义赋值 与操作的行为: &=
  11. __ixor__(self,other) 定义赋值异或操作的行为: ^=
  12. __ior__(self,other)定义赋值或操作的行为: |=

一元操作符

  1. __neg__(self) 定义正号行为: +x
  2. __pos__(self) 定义负号行为: -x
  3. __abs__(self) 定义当被 abs()调用时的行为返回数字的绝对值
  4. __invert__(self) 定义按位求反的行为: ~x

类型转换

  1. __complex__(self) 定义当被 complex 调用时的行为
  2. __int__(self) 定义当被 int() 调用时的行为
  3. __float__(self) 定义当被 float() 调用时的行为
  4. __round__(self, [ n ])定义当被 round()调用时的行为
  5. __index__(self)
    1. 当对象是被应用在切片表达式中,实现整形强制转换
    2. 如果你定义了一个可能在切片时候用到的定制的数值型,你应该定义__index__
    3. 如果 __index__ 被定义,则 __int__ 也需要被定义,且返回相同的值

上下文管理( with 语句 )

  1. __enter__(self)
    1. 定义当使用 with 语句时的初始化行为
    2. __enter__返回值被 with语句的目标或者 as 后的名字绑定
  2. __exit__(self,exc_type,exc_value,traceback)
    1. 定义当一个代码被执行或者终止后上下文管理器应该做什么
    2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

容器类型

  1. __len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数)
  2. __getitem__(self,key) 定义获取容器中指定元素的行为,相当于 dict[key] 获取 value
  3. __setitem__(self,key,value) 定义设置容器中指定元素的行为,相当于 dict[key] = value
  4. __delitem__(self,key) 定义删除容器中指定元素的行为,相当于 del dict[key]
  5. __iter__(self) 定义当迭代容器中的元素行为
    79.__reversed__(self) 定义当被 reversed()调用时的行为
  6. __contains__(self,item) 定义使用成员测试运算符(in 或 not in)时的行为

你可能感兴趣的:(类中的双下滑线方法(魔术方法))