Python**父级和子级结构中的kwargs

2024-03-28 11:32:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

class Dog(Pet):
  def __init__(self, **kwargs):
    Pet.__init__(self, 5)

那么输出是5。但是,如果我想:

^{pr2}$

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

我怎样才能以这种方式将额外的参数传递给继承链呢?在


Tags: selfobject关系initdef错误kwargsclass
2条回答

想出来了:使用Pet.__init__(self, **kwargs)

它被称为“unpacking”,它将字典kwargs转换为参数=值对的列表。在

然后父构造函数中的**kwargs能够处理它们。仅仅传递一个字典是行不通的,因为构造函数中的**kwargs需要一堆参数=值对,但是我只传递给它一个值,即子字典{}。在

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

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)

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

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

^{pr2}$

在Python 3.X中,它更好,只是:

class Dog(Pet):
  def __init__(self, **kwargs):
    super().__init__(**kwargs)

相关问题 更多 >