python super:TypeError:__ init __()需要2个位置参数,但是给出了3个

时间:2018-02-23 04:32:45

标签: python python-3.x

每一个我练习Python的人,我发现了一些奇怪的东西,这是我的代码

  

LogicG.py

class LogicGate:

    def __init__(self,n):
        self.label = n
        self.output = None

    def getLabel(self):
        return self.label

    def getOutput(self):
        self.output = self.performGateLogic()
        return self.output


class BinaryGate(LogicGate):

    def __init__(self,n):
        LogicGate.__init__(self,n)

        self.pinA = None
        self.pinB = None

    def getPinA(self):
        return int(input("Enter Pin A input for gate "+ self.getLabel()+"-->"))

    def getPinB(self):
        return int(input("Enter Pin B input for gate "+ self.getLabel()+"-->"))


class UnaryGate(LogicGate):

    def __init__(self,n):
        LogicGate.__init__(self,n)

        self.pin = None

    def getPin(self):
        return int(input("Enter Pin input for gate "+ self.getLabel()+"-->"))


class AndGate(BinaryGate):

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

    def performGateLogic(self):

        a = self.getPinA()
        b = self.getPinB()
        if a==1 and b==1:
            return 1
        else:
            return 0

然而,它显示下面的错误,我使用python 3.6.4

enter image description here

在我标出代码“超级”之后它可以正常工作

  

超级(AndGate,自我)。的初始化(个体,n)的

class AndGate(BinaryGate):

    # def __init__(self,n):
    #     super(AndGate,self).__init__(self,n)

    def performGateLogic(self):

        a = self.getPinA()
        b = self.getPinB()
        if a==1 and b==1:
            return 1
        else:
            return 0

上面那些代码只是我从这个site复制python学习,看清单11中的那个站点,它显示这些代码工作,但是当我复制到我的电脑时,代码不起作用?我要标出“超级”部分?为什么?谢谢

enter image description here

3 个答案:

答案 0 :(得分:2)

使用super时,会自动传递self

此外,在Python3.3及更高版本中,super甚至不需要接收参数来知道它正在调用哪个类。你可以这么做。

super().__init__(n)

这极大地提高了可维护性,因此它将成为首选方法。

答案 1 :(得分:2)

如果您使用的是Python 3.3及更高版本,则应替换

LogicGate.__init__(self,n)

super().__init__(n) 

当您要调用超类构造函数时,最好使用这种格式。

答案 2 :(得分:1)

您无需在此处传递self

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

应该是

super(AndGate,self).__init__(n)