Python中常見運算子過載方法

Tab609發表於2016-12-10

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

相關文章