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

据说,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)时的行为
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容