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