如果我这样写一个继承关系:
class Pet(object):
def __init__(self, n):
print n
class Dog(Pet):
def __init__(self, **kwargs):
Pet.__init__(self, 5)
则输出为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)
然后我得到错误TypeError: __init__() takes exactly one argument (two given)
如何以这种方式将额外的参数传递到继承链上?
只需将参数作为关键字参数传递下去:
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):
class Dog(Pet):
def __init__(self, **kwargs):
super(Dog, self).__init__(**kwargs)
在Python 3中。X就更好了,直接写:
class Dog(Pet):
def __init__(self, **kwargs):
super().__init__(**kwargs)
明白了:用Pet.__init__(self, **kwargs)
它被称为"解包",它将字典kwargs
转换为参数=值对的列表。
那么父构造函数中的**kwargs
就能够处理它们。只是传递一个字典不会工作,因为**kwargs
在构造函数中期待一堆参数=值对,但相反,我只是传递一个值,字典kwargs
从子。