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