父子构造函数中的Python ** wargs

And*_*ham 5 python inheritance

如果我写一个继承关系如下:

class Pet(object):
  def __init__(self, n):
    print n

class Dog(Pet):
  def __init__(self, **kwargs):
    Pet.__init__(self, 5)
Run Code Online (Sandbox Code Playgroud)

然后输出是5。但是,如果我想这样做:

class Pet(object):
  def __init__(self, **kwargs):
    if not "n" in kwargs:
      raise ValueError("Please specify the number I am to print")
    print kwargs["n"]

class Dog(Pet):
  def __init__(self, **kwargs):
    Pet.__init__(self, kwargs)
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误 TypeError: __init__() takes exactly one argument (two given)

如何以这种方式将更多的参数传递给继承链?

std*_*err 5

只需将参数作为关键字参数传递:

class Pet(object):
  def __init__(self, **kwargs):
    if not "n" in kwargs:
      raise ValueError("Please specify the number I am to print")
    print kwargs["n"]

class Dog(Pet):
  def __init__(self, **kwargs):
    Pet.__init__(self, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但是,您应该使用super而不是硬编码超类。

将您的定义更改Dog为(Python 2.X):

class Dog(Pet):
  def __init__(self, **kwargs):
    super(Dog, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

而在Python 3.X中,效果更好:

class Dog(Pet):
  def __init__(self, **kwargs):
    super().__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)