在类中,对内置对象(例如:整数和列表)所能做的事,几乎都有相应的特殊名称的重载方法。最常见的就是重载类的构造函数(__init__
函数)
方法 | 重构 | 调用 |
---|---|---|
__init__ | 构造函数 | 对象建立:X = Class(args) |
__del__ | 析构函数 | X对象收回 |
__add__ | 运算符+ | 如果没有_iadd_, X + Y, X += Y |
__or__ | 运算符|(位OR) | 如果没有 _ior_, X | Y, X |= Y |
__repr__, __str__ | 打印,转换 | print(X), repr(X), str(X) |
__call__ | 函数调用 | X(*args, **kargs) |
__getattr__ | 点号运算 | X.undefined |
__setattr__ | 属性赋值语句 | X.any = value |
__delattr__ | 属性删除 | del X.any |
__getattribute__ | 属性获取 | X.any |
__getitem__ | 索引运算 | X[key], X[i:j], 没__iter__时的for循环和其他迭代器 |
__setitem__ | 索引赋值语句 | X[key] = value, X[i:j] = sequence |
__delitem__ | 索引和分片删除 | del X[key], del X[i:j] |
__len__ | 长度 | len(X), 如果没有__bool__, 真值测试 |
__bool__ | 布尔测试 | bool(X), 真测试(在python2.6中叫做_ |
__lt__, __gt__ | 特定比较 | X < Y, X > Y, X <= Y, X >= Y |
__le__, __ge__ | 特定比较 | X == Y, X != Y |
__radd__ | 右侧加法 | other + X |
__iadd__ | 实地(增强的)加法 | X += Y (or else add |
__iter__, __next__ | 迭代环境 | I = iter(X), next(I); for loops, |
__contains__ | 成员关系测试 | item in X(任何可迭代的对象) |
__index__ | 整数值 | hex(X), bin(X), oct(X), O[X], O[X:] |
__enter__, __exit__ | 环境管理器 | with obj as var: |
__get__, __set__ | 描述符属性 | X.attr, X.attr = value, del X.value |
__delete__ | 描述符属性 | descr.__delete__(self, obj) –> None |
__new__ | 创建 | 在__init__之前创建对象 |
下面我们看一个例子,重构列表中+
运算符, 变成只打印: Hello, Python.
# 先看看原list加号运算符
>>> lst = list()
>>> lst.append(1)
>>> lst
[1]
>>> lst + [2]
>>> lst
[1, 2]
# 重构`+`号运算符方法__add__
class A(list):
def __add__(self, other):
print 'Hello, Python.'
>>> newlst = A()
>>> newlst.append(1)
>>> newlst + [2]
Hello, Python.
>>> newlst
[1]
我们在类A中重载了列表+
号运算符的方法__add__
,它只输出Hello, Python.
,所以当我们类A的实例对象newlst调用+
号运算符时,并没有像lst一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。