文章目录
  1. 1. 一、为确保类是新型的,模块最开始要输入赋值语句__metaclass__=type,或者直接或间接地子类化内建类object(或其他一些新式类)。
  2. 2. 二、构造和初始化
  3. 3. 三、用于比较的魔术方法
  4. 4. 四、数值处理的魔术方法
  5. 5. 五、普通算数操作符
  6. 6. 六、反射算术操作符
  7. 7. 七、增量赋值
  8. 8. 八、类型转换
  9. 9. 九、描述类
  10. 10. 十、属性访问控制
  11. 11. 十一、隐藏在容器背后的魔法
  12. 12. 十二、反射
  13. 13. 十三、可调用对象
  14. 14. 十四、构建描述符对象
  15. 15. 十五、Pickling自定义的对象

魔法方法即前后各加两个下划线的名字组成的集合所包含的方法。(如果对象实现了魔法方法中的某一个,那么这个方法会在特殊的情况下被调用)



一、为确保类是新型的,模块最开始要输入赋值语句__metaclass__=type,或者直接或间接地子类化内建类object(或其他一些新式类)。


二、构造和初始化

1.__new__(cls,…):一个对象实例化的时候所调用的第一个方法,它的第一个参数是这个类,其他的参数是用来直接传递给__init__ 方法。
2.__init__(self,…):(最基本的魔术方法)
这是类的初始化方法,当构造函数被调用的时候的任何参数都将会传给它。
3.__del__(self):它定义的是当一个对象进行垃圾回收时候的行为。
当调用 x = SomeClass() 的时候,__init__ 并不是第一个被调用的方法。是__new__来构造这个实例。\


三、用于比较的魔术方法

1.__cmp__:最基本的用于比较的魔术方法。它实际上实现了所有的比较符号(<,==,!=,等等)
2.__eq__(self, other):等号, ==
3.__ne__(self, other):不等号, !=
4.__lt__(self, other):小于号, <
5.__gt__(self, other):大于等于号,>= \


四、数值处理的魔术方法

一元操作符和函数:仅仅有一个操作位的一元操作符和函数

__pos__(self):正号
__neg__(self):负号
__abs__(self):实现内置abs()函数的行为
__invert__(self) :~ 符号\


五、普通算数操作符

__add__(self, other):加法
__sub__(self, other):减法
__mul__(self, other):乘法
__floordiv__(self, other):地板除法,使用//操作符
__div__(self, other):传统除法,使用/操作符
__truediv__(self, other):真正除法。注意,只有当from __future__ import division时才会有效
__mod__(self, other):求模,使用%操作符
__divmod__(self, other):实现内建函数divmod()的行为
__pow__(self, other):乘方,使用**操作符
__lshift__(self, other):左按位位移,使用<<操作符
__rshift__(self, other):右按位位移,使用>>操作符
__and__(self, other):按位与,使用&操作符
__or__(self, other):按位或,使用|操作符
__xor__(self, other):按位异或,使用^操作符\


六、反射算术操作符

改变操作数的位置关系,大多数情况下,反射算术操作的结果等价于常规算术操作

__radd__(self, other):反射加法
__rsub__(self, other):反射减法
__rmul__(self, other):反射乘法
__rfloordiv__(self, other):反射地板除,用//操作符
__rdiv__(self, other):传统除法,用/操作符
__rturediv__(self, other):真实除法,注意,只有当from __future__ import division时才会有效
__rmod__(self, other):反射求模,用%操作符
__rdivmod__(self,other):实现内置函数divmod()的长除行为,当调用divmod(other,self)时被调用
__rpow__(self, other):反射乘方,用**操作符
__rlshift__(self, other):反射的左按位位移,使用<<操作符
__rrshift__(self, other):反射的右按位位移,使用>>操作符
__rand__(self, other):反射的按位与,使用&操作符
__ror__(self, other):反射的按位或,使用|操作符
__rxor__(self, other):反射的按位异或,使用^操作符\


七、增量赋值

__iadd__(self, other):加法和赋值
__isub__(self, other):减法和赋值
__imul__(self, other):乘法和赋值
__ifloordiv__(self, other):地板除和赋值,用//=操作符
__idiv__(self, other):传统除法和赋值,用/=操作符
__iturediv__(self, other):真实除法和赋值,注意,只有当from __future__ import division时才会有效
__imod__(self, other):求模和赋值,用%=操作符
__ipow__(self, other):乘方和赋值,用**=操作符
__ilshift__(self, other):左按位位移和赋值,使用<<=操作符
__irshift__(self, other):右按位位移和赋值,使用>>=操作符
__iand__(self, other):按位与和赋值,使用&=操作符
__ior__(self, other):按位或和赋值,使用|=操作符
__ixor__(self, other):按位异或和赋值,使用^=操作符\


八、类型转换

__int__(self):实现到整型的类型转换
__long__(self):长整形
__float__(self):浮点型
__complex__(self):复数型
__oct__(self):8进制型
__hex__(self):16进制型
__index__(self):实现一个当对象被切片到int的类型转换。若自定义了一个数值类型,考虑到它可能被切片,要重载__index__
__trunc__(self):当math.trunc(self)被调用时调用。返回一个整型的截断
__coerce__(self,other):实现混合模式的算术。如果类型转换不可能则返回None。否则,它应当返回一对相同类型的元祖\


九、描述类

在类中自定义内建函数返回类行为的描述

__str__(self):定义行为
__repr__(self):定义行为。
str()和repr()主要的区别在于它的阅读对象。repr()产生的输出主要为计算机可读,而str()则是为了让人类可读。
__unicode__(self):定义行为。
unicode()像是str(),但它返回一个unicode字符串。如果你的类中的一个实例调用了str(),而你仅定义了__unicode__(),那它是不会工作的。以防万一,你应当总是定义好 __str__(),哪怕用户不会使用unicode
__hash__(self):定义行为。它必须返回一个整型,而且它的结果是用于来在字典中作为快速键比对。
__nonzero__(self):定义行为。返回True或False,取决于你是否考虑一个实例是True或False。


十、属性访问控制

__getattr__(self, name):用户在试图访问不存在(不论是存在或尚未建立)的类属性时定义其行为
__setattr__(self, name, value):允许你为一个属性赋值
__delattr__:删除类属性(当在__delattr__中调用del self.name会引起无限递归)
__getattribute__(self, name):允许你定规则,在任何时候不管一个类属性的值那时候是否可访问。


十一、隐藏在容器背后的魔法

__len__(self):返回容器的长度
__getitem__(self, key):定义当某一个item被访问时的行为,使用self[key]表示法。
__setitem__(self, key, value):定义当某一个item被赋值时候的行为,使用self[key]=value表示法。
__delitem__(self, key):定义当某一个item被删除(例如 del self[key])时的行为。
__iter__(self):应该给容器返回一个迭代器。迭代器会返回若干内容,大多使用内建函数iter()表示。当一个容器使用形如for x in container:的循环。迭代器本身就是其对象,同时也要定义好一个__iter__方法来返回自身。
__reversed__(self):定义调用内建函数reversed()时的行为。应返回一个反向版本的列表。
__contains__(self, item):__contains__为成员关系,用in和not in测试时定义的行为
__concat__(self, other):定义序列和另外一个序列的连接。


十二、反射

__instancecheck__(self, instance):检查一个实例是否是你定义类中的一个实例(比如,isinstance(instance, class))
__subclasscheck__(self, subclass):检查一个类是否是你定义类的子类比如,issubclass(subclass, class))


十三、可调用对象

__call__(self, [args…]):允许类实例像函数一样被调用。


十四、构建描述符对象

描述符可以改变其他对象。

__get__(self, instance, owner):描述符的值被取回时定义其行为。instance是owner对象的一个实例,owner是所有类。
__set__(self, instance, value):描述符的值被改变时定义其行为。instance是owner对象的一个实例,value是设置的描述符的值
__delete__(self, instance):描述符的值被删除时定义其行为。instance是owner对象的一个实例。


十五、Pickling自定义的对象

__getinitargs__(self):当类unpickled时调用__init__,可以定义__getinitargs__,该方法返回一个元组的参数,然后传递给__init__。(旧式类)
__getnewargs__(self):进行unpickling时将参数传递到__new__。该方法返回一个元组参数,然后能传递给__new__。 (新式类)
__getstate__(self):代替对象的__dict__属性被保存。
__setstate__(self, state):对象unpickled时,如果__setstate__定义对象状态会传递来代替直接用对象的__dict__属性。

文章目录
  1. 1. 一、为确保类是新型的,模块最开始要输入赋值语句__metaclass__=type,或者直接或间接地子类化内建类object(或其他一些新式类)。
  2. 2. 二、构造和初始化
  3. 3. 三、用于比较的魔术方法
  4. 4. 四、数值处理的魔术方法
  5. 5. 五、普通算数操作符
  6. 6. 六、反射算术操作符
  7. 7. 七、增量赋值
  8. 8. 八、类型转换
  9. 9. 九、描述类
  10. 10. 十、属性访问控制
  11. 11. 十一、隐藏在容器背后的魔法
  12. 12. 十二、反射
  13. 13. 十三、可调用对象
  14. 14. 十四、构建描述符对象
  15. 15. 十五、Pickling自定义的对象