new

__new__ 是在一个对象实例化的时候所调用的第一个方法,它的第一个参数是这个类,其他 的参数是用来直接传递给 __init__ 方法

del

__del__ 定义的是当一个对象进行垃圾回收时候的行为。一个对象在删除的时需要更多的清 洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的 时候对象还存存在,就不能保证 __del__ 能够被执行

用于比较的魔术方法

  • cmp(self, other):最基本的用于比较的魔术方法,它实际上实现了所有的比较符号 (<,==,!=,etc.),但通常最好的一种方式是去分别定义每一个比较符号而不是一次性将他 们都定义
  • eq(self, other):定义了等号的行为,==
  • ne(self, other):定义了不等号的行为,!=
  • lt(self, other):定义了小于号的行为,<
  • gt(self, other):定义了大于等于号的行为,>=

数值处理的魔术方法

  • pos(self):实现正号的特性(比如 +some_object)
  • neg(self):实现负号的特性(比如 -some_object)
  • abs(self):实现内置 abs() 函数的特性
  • invert(self):实现 ~ 符号的特性(http://en.wikipedia.org/wiki/Bitwise_operation#NOT

普通算术操作符

  • 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):实现使用 ^ 的按位异或

cheatsheet

魔术方法调用方式解释
new(cls [,…])instance = MyClass(arg1, arg2)__new__在创建实例的时候被调用
init(self [,…])instance = MyClass(arg1, arg2)__init__在创建实例的时候被调用
cmp(self, other)self == other, self > other, 等。在比较的时候调用
pos(self)+self一元加运算符
neg(self)-self一元减运算符
invert(self)~self取反运算符
index(self)x[self]对象被作为索引使用的时候
nonzero(self)bool(self)对象的布尔值
getattr(self, name)self.name # name 不存在访问一个不存在的属性时
setattr(self, name, val)self.name = val对一个属性赋值时
delattr(self, name)del self.name删除一个属性时
__getattribute(self, name)self.name访问任何属性时
getitem(self, key)self[key]使用索引访问元素时
setitem(self, key, val)self[key] = val对某个索引值赋值时
delitem(self, key)del self[key]删除某个索引值时
iter(self)for x in self迭代时
contains(self, value)value in self, value not in self使用 in 操作测试关系时
concat(self, value)self + other连接两个对象时
call(self [,…])self(args)“调用”对象时
enter(self)with self as x:with 语句环境管理
exit(self, exc, val, trace)with self as x:with 语句环境管理
getstate(self)pickle.dump(pkl_file, self)序列化
setstate(self)data = pickle.load(pkl_file)序列化