Python 不了解某些合成方面(非合成)

Python 不了解某些合成方面(非合成),python,duck-typing,Python,Duck Typing,我正在用Python复习一些数据结构和算法,所以我正在实现一个无序链表。在同一个文件中,我首先编写了一个节点类,然后是一个列表类。我不知道search_item()方法中的“current”变量似乎是一个节点对象,或者至少能够访问节点类方法和属性。我注意到,如果我注释掉我的add_node()方法,那么“current”就不再有权访问节点的方法。现在我既没有显式地使用继承也没有使用组合,所以我很难看到current如何以下面编写代码的方式调用get_next()。我想我必须将current声明为

我正在用Python复习一些数据结构和算法,所以我正在实现一个无序链表。在同一个文件中,我首先编写了一个节点类,然后是一个列表类。我不知道search_item()方法中的“current”变量似乎是一个节点对象,或者至少能够访问节点类方法和属性。我注意到,如果我注释掉我的add_node()方法,那么“current”就不再有权访问节点的方法。现在我既没有显式地使用继承也没有使用组合,所以我很难看到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
的实例,因为
tmp
是由
tmp=node(item)
创建的,然后分配给
self.head=tmp
。因此,当设置
current=self.head
时,它已经引用了
Node
(或
None
)的一个实例,因此您不需要调用
current=Node(self.head)

,我最近刚刚遇到了duck类型的概念,我的这篇老文章浮现在脑海中。看来这就是问题所在,只是当时不明白而已默认情况下,“当前”设置为“无”,当调用节点类中定义的任何方法时,它将自动定义为节点对象。

您的示例中没有继承。那么,您不了解哪些继承方面?你能改变你的问题吗?@olivecoder,没错,正如我在我的原始帖子中提到的,我没有明确使用继承或组合,而是以某种方式声明无序列表(Node),然后实例化current=Node(self.head),简单地执行current=self.head可以让当前访问节点的方法,我想了解原因。希望这能澄清我的问题。没有TBadr。您根本没有使用继承,显式或隐式(?)。这个问题与继承没有任何关系。你只是无法遵循代码。我可以说这里的概念是组合而不是继承,但这一点都不重要。所以我试着为你的问题建议一个编辑,但我无法想象一个标题,这肯定不是当前的标题。考虑到这一点,这可能是某种我不理解的含蓄的作文,如果我的帖子让人困惑,对不起。编辑标题将继承改为合成,希望没问题。感谢@DAXaholic的回复。我在文件(堆栈)中添加了第三个类,并在List类中添加了一个指向堆栈实例的伪方法,从而验证了您的解释。我想看看如果self.head指向多个类型的对象,“current”会拾取什么。奇怪的是“当前”始终只拾取节点类方法和属性,而不管它们被调用的顺序如何。它拾取堆栈方法和属性的唯一方法是注释self.head指向节点对象的代码。我通过将self.head设置为类中不同类型的对象来运行进一步的实验。然后发生的情况是,如果您设置了某个var=self.head,那么它将采用我们定义的第一个对象的类型(在我的例子中是通过self.head=tmp定义的节点对象),否则它将保持非类型。谢谢你的帮助。