不了解某些组成方面(不是组成)

Not understanding some composition aspects (not composition)

我正在用 Python 复习一些数据结构和算法,所以我正在实现一个无序列表。在同一个文件中,我先写了一个节点 class,然后是一个列表 class。我不明白的是,我的 search_item() 方法中的 "current" 变量似乎是一个节点对象,或者至少能够访问节点 class 方法和属性。我注意到,如果我注释掉我的 add_node() 方法,那么 "current" 将无法再访问 Node 的方法。现在我既没有明确使用继承也没有使用组合,所以我很难看到 current 如何按照下面编写代码的方式调用 get_next() 。我认为我必须将 current 声明为:current = Node(self.head) 但 current = self.head 似乎有效? 非常感谢您的帮助。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

    def get_data(self):
        return self.data

    def set_data(self, d):
        self.data = d

    def get_next(self):
        return self .next

    def set_next(self, n):
        self.next = n

class UnorderedList:
    def __init__(self):
        self.head = None

    def add_node(self, item):
        tmp = Node(item)
        tmp.set_next(self.head)
        self.head = tmp

    def search_item(self, item):
        current = self.head
        # current = Node(self.head)
        found = False
        while current != None and not found:
            if current.get_data() == item:
                found = True
            else:
                current = current.get_next()
        return found

好吧,如果你注释掉 add_node 那么你就不会再向链表中添加节点,因此 search_item 将始终看到 self.head 的初始值,即 None.

调用 current.get_next() 之所以有效,是因为通过 add_node 您始终确保 self.head 指向 None 或指向 Node 的实例 tmptmp = Node(item) 创建,然后分配给 self.head = tmp。因此,当设置 current = self.head 时,它已经引用了 Node(或 None)的实例,因此您不需要调用 current = Node(self.head).

我最近刚接触到鸭子打字的概念,然后想到了我的这个旧 post。似乎这就是在起作用,只是当时不理解。 'current' 默认设置为 None,当调用节点 class 中定义的任何方法时,它会自动定义为节点对象。