Python 不了解某些合成方面(非合成)
我正在用Python复习一些数据结构和算法,所以我正在实现一个无序链表。在同一个文件中,我首先编写了一个节点类,然后是一个列表类。我不知道search_item()方法中的“current”变量似乎是一个节点对象,或者至少能够访问节点类方法和属性。我注意到,如果我注释掉我的add_node()方法,那么“current”就不再有权访问节点的方法。现在我既没有显式地使用继承也没有使用组合,所以我很难看到current如何以下面编写代码的方式调用get_next()。我想我必须将current声明为:current=Node(self.head),但是仅仅current=self.head似乎有效? 非常感谢你的帮助Python 不了解某些合成方面(非合成),python,duck-typing,Python,Duck Typing,我正在用Python复习一些数据结构和算法,所以我正在实现一个无序链表。在同一个文件中,我首先编写了一个节点类,然后是一个列表类。我不知道search_item()方法中的“current”变量似乎是一个节点对象,或者至少能够访问节点类方法和属性。我注意到,如果我注释掉我的add_node()方法,那么“current”就不再有权访问节点的方法。现在我既没有显式地使用继承也没有使用组合,所以我很难看到current如何以下面编写代码的方式调用get_next()。我想我必须将current声明为
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定义的节点对象),否则它将保持非类型。谢谢你的帮助。