使用super时出错:__ init __()只需1个参数

时间:2015-02-26 19:19:24

标签: python

任何人都可以解释我为什么__init__()使用以下代码

获得1个参数错误
class ABC(object):
    def __init__(self, **kwargs):
        self.x=20
        super(ABC, self).__init__(self, **kwargs)

class DEF(object):
     def __init__(self, **kwargs):
        self.y=30
        super(DEF, self).__init__(self, **kwargs)

class XYZ(ABC,DEF):
     def __init__(self, **kwargs):
        super(XYZ, self).__init__(self, **kwargs)

>>> x=XYZ()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/test.py", line 13, in __init__
    super(XYZ, self).__init__(self, **kwargs)
TypeError: __init__() takes exactly 1 argument (2 given)

>>> x=XYZ(a=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/hprem/junk", line 13, in __init__
    super(XYZ, self).__init__(self, **kwargs)
TypeError: __init__() takes exactly 1 argument (3 given)

1 个答案:

答案 0 :(得分:5)

您无需将self显式传递给超类__init__。通过执行super(XYZ, self),您创建了一个“知道”self是什么的“绑定”超级对象。只需super(XYZ, self).__init__(**kwargs)(同样适用于您的其他电话)。

但请注意,如果传递任何kwargs,此类结构将失败。 object.__init__不接受任何参数,因此您无法传递任何参数。出于这个原因,直接从object继承的类通常不能安全地使用super(除非它在没有参数的情况下显式调用它,在这种情况下根本不需要调用它)。最好创建一个“{1}}和ABC继承的”最顶层“超类。