【问题标题】:Not understanding some composition aspects (not composition)不了解某些构图方面(不是构图)
【发布时间】:2016-06-17 04:19:41
【问题描述】:

我正在用 Python 复习一些数据结构和算法,所以我正在实现一个无序列表。在同一个文件中,我首先编写了一个 Node 类,然后是一个 List 类。我没有得到的是我的 search_item() 方法中的“当前”变量似乎是一个节点对象,或者至少能够访问节点类方法和属性。我注意到,如果我注释掉我的 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

【问题讨论】:

  • 没有继承你的例子。那么您不了解哪些继承方面?你能改变你的问题吗?
  • @olivecoder,正确,正如我在原始帖子中提到的那样,我没有明确使用继承或组合,而是以某种方式而不是声明 UnorderedList(Node) 然后实例化 current = Node(self.head),只需执行 current = self.head 即可获得对 Node 方法的当前访问权限,我想了解原因。希望这能解决我的问题。
  • 没有 TBadr。您根本没有使用继承,显式或隐式(?)。这个问题与继承没有任何关系。您只是无法遵循代码。我可以说这里的概念是组合而不是继承,但这根本不重要。所以我试着建议对你的问题进行编辑,但我无法想象它的标题,肯定不是当前的。
  • 指出,这可能是某种我不理解的隐含构图,如果我的帖子令人困惑,请见谅。编辑标题以将 I 继承更改为组合,希望没关系。

标签: python duck-typing


【解决方案1】:

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

调用current.get_next() 可以正常工作,因为通过add_node,您始终确保self.head 指向NoneNode 的实例,因为tmp 是由tmp = Node(item) 创建的,然后分配给@ 987654332@。因此,当设置current = self.head 时,它已经引用了Node(或None)的实例,因此您无需调用current = Node(self.head)

【讨论】:

  • 感谢@DAXaholic 的回复。我通过在文件(堆栈)中添加第三个类来测试您的解释,并在指向堆栈实例的 List 类中添加了一个虚拟方法。如果 self.head 指向不止一种类型的对象,我想看看“当前”会得到什么。奇怪的是“当前”总是选择 Node 类方法和属性,无论它们被调用的顺序如何,它选择堆栈方法和属性的唯一方法是如果我注释掉 self.head 指向的代码节点对象。
  • 我通过将 self.head 设置为类中不同类型的对象进行了进一步的实验。然后发生的情况是,如果您设置了某个 var = self.head,那么它将采用我们定义的第一个对象的类型(在我的情况下是通过 self.head = tmp 的 Node 对象),否则它仍然存在无类型。感谢您的帮助。
【解决方案2】:

我最近才遇到鸭子打字的概念,我的这篇旧帖子浮现在脑海中。似乎这就是在起作用,只是当时不明白。 'current' 默认设置为 None,当调用 Node 类中定义的任何方法时,它会自动定义为 Node 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多