Каждый, кто я практикую 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 , самость) . < сильный > INIT ( я, п)

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

Выше этого кода я просто копирую из этого

enter image description here

0
lim 23 Фев 2018 в 07:32

3 ответа

Лучший ответ

Вам не нужно проходить self здесь:

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

Так должно быть

super(AndGate,self).__init__(n)
1
0xc0de 23 Фев 2018 в 04:34

Если вы используете Python 3.3 и выше, вы должны заменить

LogicGate.__init__(self,n)

С участием

super().__init__(n) 

Этот формат лучше использовать, когда вы захотите вызвать конструктор суперкласса.

2
Farshid 30 Окт 2018 в 05:27

При использовании super, self передается автоматически.

Кроме того, в Python3.3 и выше super даже не нужно получать аргументы, чтобы знать, из какого класса он вызывается. Вы можете просто сделать это.

super().__init__(n)

Это значительно улучшает ремонтопригодность, поэтому это был бы предпочтительный подход.

2
Olivier Melançon 23 Фев 2018 в 05:31