【问题标题】:python super :TypeError: __init__() takes 2 positional arguments but 3 were givenpython super :TypeError: __init__() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2018-02-23 04:32:44
【问题描述】:

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

逻辑G.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

在我将代码标记为“超级”后,它可以正常工作

super(AndGate,self).init(self,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 中的那个站点,它显示了这些代码工作,但是当我复制到我的计算机时,代码没有工作?我必须标出“超级”部分??为什么?谢谢

【问题讨论】:

标签: python python-3.x


【解决方案1】:

使用super时,self会自动传递。

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

super().__init__(n)

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

【讨论】:

    【解决方案2】:

    如果你使用的是 Python 3.3 及以上版本,你应该替换

    LogicGate.__init__(self,n)
    

    super().__init__(n) 
    

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

    【讨论】:

      【解决方案3】:

      这里不需要传递self

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

      应该是

      super(AndGate,self).__init__(n)
      

      【讨论】:

        猜你喜欢
        • 2017-02-18
        • 2014-05-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 2018-03-07
        • 1970-01-01
        • 2019-12-07
        相关资源
        最近更新 更多