使用继承,实例化,*args,**kwargs在代码中混淆

Ben*_*ey4 3 python class

class Pen(object):
    def __init__(self, mean_radius = None, length = None):
        self.usage = "Is used to apply ink trails to drawing surfaces"
        self.mean_radius = mean_radius
        self.length = length

class FountainPen(Pen):
    def __init__(self, manufacturer = "Waterman", *args, **kwargs):
        Pen.__init__(self, *args, **kwargs)
        self.manufacturer = manufacturer
        self.cartridge_state =  "non-empty"

>>> instance_FP = FountainPen(5, 1)
>>> instance_FP.mean_radius
>>> print instance_FP.mean_radius
1    
>>> print instance_FP.length
None
Run Code Online (Sandbox Code Playgroud)

5在实例化中作为参数传递的整数会发生什么FountainPen?为什么print instance_FP.mean_radius回归1而不是5

Mat*_*lia 6

你必须这样认为:*args并且**kwargs"吃掉"它们之前的"常规"参数留下的所有位置/关键字参数.如果你把它们放在最后,它们只会得到任何不符合"常规参数"的东西.

所以,当你写下FountainPen(5,1)发生的事情是这样FountainPen.__init__被调用:

  • self 设置为新创建的实例;
  • manufacturer 得到第一个参数,即5;
  • *args"吃掉"所有剩余的位置参数,即只是1; 所以args现在设定为[1];
  • *kwargs会吃任何关键字参数,但没有,所以它变成了{}.

然后很明显,Pen.__init__只是1作为参数(除此之外self)调用,并length保持设置为其默认值(None).