调用函数时使用 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