【问题标题】:How do I call a method from my outer class in an inner class of my custom-made linked list?如何在自定义链表的内部类中调用外部类中的方法?
【发布时间】:2021-05-15 19:08:51
【问题描述】:

我正在学习 Python,并通过从头开始编写自己的链表来挑战自己。我正在使用内部节点类的传统结构,它包含一段数据和对下一个节点的引用。现在我正在尝试创建一个__repr__ 方法,该方法返回一个节点的字符串表示形式。它返回的字符串如下所示:"This node contains {0}. The next node is {1}." .format(self.data, self.next.data)

除非列表中只有 1 个节点,否则它工作正常,这给了我以下错误:AttributeError: 'NoneType' object has no attribute 'data'.

为了解决这个问题,我首先检查列表中是否只有一个节点,然后返回以下字符串:"This node contains {0}. There is no next node." .format(self.data)

这就是我的__repr__ 方法现在的样子:

      def __repr__(self):
            if MyLinkedList.get_size() == 1:
                return "This node contains {0}. There is no next node." . format(self.data)
            return "This node contains {0}. The next node is {1}." .format(self.data, self.next.data)

这是目前整个链表类的样子:

class MyLinkedList(object):

    head = None
    size = None

    def __init__(self):
        self.size = 0

    def get_head(self):
        return self.head

    def get_size(self):
        return self.size

    def is_empty(self):
        if self.size == 0:
            return True
        else:
            return False

    def __repr__(self):
        result = "["
        curr = self.head
        while curr != None:
            if curr.next == None:
                result += curr.data
                break
            result += curr.data
            result += ", "
            curr = curr.next
        result += "]"
        return result

    def add_to_head(self, data):
        new_node = MyLinkedList.Node(data)
        if self.size == 0:
            self.head = new_node
        else:
            new_node.next = self.head
            self.head = new_node
        self.size += 1

    def delete_from_head(self):
        if (self.size == 0):
            self.head = None
        else:
            new_head = self.head.next
            self.head = new_head
        self.size =- 1

    class Node():

        next = None

        def __init__(self, data):
            self.data = data

        def get_data(self):
            return self.data

        def get_next(self):
            return self.next

        def __repr__(self):
            if MyLinkedList.get_size() == 1:
                return "This node contains {0}. There is no next node." . format(self.data)
            return "This node contains {0}. The next node is {1}." .format(self.data, self.next.data)

但是现在当我尝试打印任何节点的字符串表示时,它给了我以下错误:TypeError: get_size() missing 1 required positional argument: 'self'

有没有办法解决这个问题?我要做的就是在我的内部节点类中调用我的外部类的 get_size() 方法,并检查该值是否为 1。有没有其他方法可以使我的节点的 __repr__ 方法返回字符串 I当列表中只有一个节点时希望它返回?

另外,如果您发现可以对我的代码进行的其他改进,我会很高兴听到这些。

【问题讨论】:

  • 不要尝试从节点的__repr__方法调用链表的get_size方法。一个节点只知道它包含的值,以及它的next 引用。您可以检查next 是否为None。如果是,则没有下一个节点。
  • 请提供minimal reproducible example,在这种情况下,这意味着添加创建链表并尝试打印节点的字符串表示的代码。

标签: python linked-list inner-classes


【解决方案1】:

您只能在 MyLinkedList 类的实例上调用 get_size()。无论如何,节点都不应该知道有关链表类的任何信息。只需利用节点的 next 指针即可:

def __repr__(self):
    suffix = "There is not next node" if self.next is None else "The next node is {}".format(self.next.data)
    return "This node contains {}. {}.".format(self.data, suffix)

【讨论】:

    【解决方案2】:

    我相信您需要在 get_size() 方法中添加一个 self 参数。如:

    def __repr__(self):
                if MyLinkedList.get_size(self) == 1:
                    return "This node contains {0}. There is no next node." . format(self.data)
                return "This node contains {0}. The next node is {1}." .format(self.data, self.next.data)
    

    【讨论】:

      猜你喜欢
      • 2019-04-16
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多