呼叫函式時使用 args
函式定義中*args 的一個常見用例是將處理委託給包裝或繼承的函式。一個典型的例子可能是在類的 __init__ 方法中
class A(object):
def __init__(self, b, c):
self.y = b
self.z = c
class B(A):
def __init__(self, a, *args, **kwargs):
super(B, self).__init__(*args, **kwargs)
self.x = a
這裡,a 引數在所有其他引數(位置和關鍵字)傳遞到 - 並由基類處理之後由子類處理。
例如:
b = B(1, 2, 3)
b.x # 1
b.y # 2
b.z # 3
這裡發生的是 B __init__ 類函式看到 1, 2, 3 的引數。它知道它需要採用一個位置引數(a),因此它抓住傳入的第一個引數(1),因此在函式 a == 1 的範圍內。
接下來,它看到它需要採用任意數量的位置引數(*args),因此它接受傳入的其餘位置引數(1, 2)並將它們填充到*args 中。現在(在函式的範圍內)args == [2, 3]。
然後,它用*args 呼叫類 A 的 __init__ 函式。Python 在 args 前面看到*並將列表解包成引數。在這個例子中,當類 B 的 __init__ 函式呼叫類 A 的 __init__ 函式時,它將傳遞引數 2, 3(即 A(2, 3))。
最後,它將自己的 x 屬性設定為第一個位置引數 a,它等於 1。