Не понимаю, почему эта TypeError возникает при попытке вызвать унаследованный метод - PullRequest
0 голосов
/ 26 октября 2018

Во-первых, я использую python 3.6.

Я пытаюсь import и использую свой собственный файл .py в своем проекте.Я import мой LinkedList.py файл и создаю класс Mylist, который расширяет класс импортируемого файла.

Когда я пытаюсь создать экземпляр класса Mylist, который включает создание экземпляраМой inheritedLinkedList производный класс, я получаю следующую ошибку:

Traceback (most recent call last):
  File "*/PycharmProjects/Veri Yapilari/lists.py", line 65, in <module>
    test = Mylist()
  File "*/PycharmProjects/Veri Yapilari/lists.py", line 38, in __init__
    self.linkedlist = inheritedLinkedList()
  File "*/PycharmProjects/Veri Yapilari/lists.py", line 8, in __init__
    super.__init__()
TypeError: descriptor '__init__' of 'super' object needs an argument

Вот часть кода, где возникает проблема:

test = Mylist()
test.insertFirstM(incomingDataM=4)  # <- Causes a TypeError.

Ниже приведен основной сценарий в полном объеме:

import LinkedList as myLinkedList


class inheritedLinkedList(myLinkedList.DoublyLinkedList):
    def __init__(self):
        super.__init__()
    def raplaceElements(self, dataToBeChanged, incomingData):
        position = self.find(dataToBeChanged)
        position.data = incomingData
    def swapElements(self, swap1, swap2):
        position1 = self.find(swap1)
        prev1 = position1.previous
        next1 = position1.next
        position2 = self.find(swap2)
        prev2 = position2.previous
        next2 = position2.next

        prev1.next = position1
        position1.previous = prev1
        position1.next = next1
        next1.previous = position1

        prev2.next = position2
        position2.previous = prev2
        position2.next = next2
        next2.previous = position2
    def insertBefore(self, incomingData, previousNode=None):
        self.insert(incomingData, self.find(previousNode).previous.data)


class Mylist:
    def __init__(self):
#        self.linkedlist = inheritedLinkedList;
        self.linkedlist = inheritedLinkedList()  # Per martineau's suggestion.

    def replaceElements(self, dataToBeChanged, incomingData):
        self.linkedlist.raplaceElements(dataToBeChanged, incomingData)

    def swapElements(self, swap1, swap2):
        self.linkedlist.swapElements(swap1, swap2)

    def insertFirstM(self, incomingDataM):
        self.linkedlist.insertFirst(incomingDataM)

    def insertLast(self, incomingData):
        self.linkedlist.insert(incomingData)

    def insertAfter(self, incomingData, incomingNode):
        self.linkedlist.insert(incomingData, incomingNode)

    def insertBefore(self, incomingData, incomingNode):
        self.linkedlist.insert(incomingData, incomingNode)

    def remove(self, incomingData):
        self.linkedlist.remove(incomingData)

    def listprint(self):
        self.linkedlist.listprint()


test = Mylist()
test.insertFirstM(4)

Код для импортированного модуля LinkedList (LinkedList.py) можно получить - при необходимости - загрузив его из моего репозитория github .

1 Ответ

0 голосов
/ 30 октября 2018

Как я уже сказал в комментарии, вы неправильно используете встроенный super.Вместо этого попробуйте сделать это следующим образом (это похоже на пример в связанной документации):

class inheritedLinkedList(myLinkedList.DoublyLinkedList):
    def __init__(self):
        super().__init__()  # Change line to this.

На самом деле, поскольку производный класс '__init__() в настоящее время не делает ничего, кроме этого, он даже не нужен, потому что эточто произойдет автоматически, если подкласс не определит свой собственный.Другими словами, следующее могло бы выполнить то же самое:

class inheritedLinkedList(myLinkedList.DoublyLinkedList):
#    ** NOT REALLY NEEDED AT ALL **
#    def __init__(self):
#        super().__init__()

PS Вам также следует изменить самый конец сценария LinkedList.py, чтобы последние несколько строк были тамне выполнять, когда import редактируется как модуль lists.py:

            ...
            nextNode.previous = previousNode
            dataToBeDeleted.next = dataToBeDeleted.previous = None

if __name__ == '__main__':  # Should add this, too.

    list1 = SinglyLinkedList()
    list2 = DoublyLinkedList()

    list2.insertFirst(6)
...