在類中,對內置對象(例如:整數和列表)所能做的事,幾乎都有相應的特殊名稱的重載方法。最常見的就是重載類的構造函數(__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一樣,添加新的成員,而只是輸出字符串(這就是重構運算符方法)。