呼叫函式時使用 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
。