在类中,对内置对象(例如:整数和列表)所能做的事,几乎都有相应的特殊名称的重载方法。最常见的就是重载类的构造函数(__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一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。
版权声明:本文为luckytanggu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。