*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
这里发生的是classB __init__函数看到参数1, 2, 3。它知道需要采用一个位置参数(a),因此它会抓取传入(1)的第一个参数,因此在函数范围内a == 1。
接下来,它看到需要采用任意数量的位置参数(*args),因此它将传入(1, 2)的其余位置参数填充到中*args。现在(在功能范围内)args == [2, 3]。
然后,它使用调用类A的__init__函数*args。Python看到*args的前面,并将列表“解包”为参数。在此示例中,当classB的__init__函数调用classA的__init__函数时,将传递参数2, 3(即A(2, 3))。
最后,它将自己的x属性设置为第一个位置参数a,即equals 1。