为什么使用 super() 初始化基类时会"TypeError: __init__() takes 2 positional arguments but 3 were given"?



我有一些代码来创建类层次结构:

class LogicGate:
    def __init__(self, n):
        self.label = n
        self.output = None
class BinaryGate(LogicGate):
    def __init__(self, n):
        LogicGate.__init__(self, n)
        self.pinA = None
        self.pinB = None
class AndGate(BinaryGate):
    def __init__(self, n):
        super(AndGate, self).__init__(self, n)

但是当我尝试创建AndGate时,发生错误:

>>> AndGate('example')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: BinaryGate.__init__() takes 2 positional arguments but 3 were given

代码有什么问题?为什么错误声称将3个参数提供给BinaryGate.__init__()?我应该如何正确使用super

使用super时,self自动传递。

另外,在Python3.3及更高版本中,super甚至不需要收到参数来了解其称为哪个类。您可以简单地执行此操作。

super().__init__(n)

这大大提高了可维护性,因此这将是首选的方法。

如果您使用的是python 3.3及以上,则应替换

LogicGate.__init__(self,n)

super().__init__(n) 

最好在要调用超级类构造函数时使用此格式。

您不需要在此处通过self

super(AndGate,self).__init__(self,n)

应该是

super(AndGate,self).__init__(n)

相关内容

最新更新