<p>@sgusc发现了一个非常大的问题:命名一个函数<code>first</code>和命名一个数据属性<code>first</code>。后者最终会覆盖前者(因为函数实际上在<code>class</code>中,而不是实例中)。在</p>
<p>解决这个问题会让你的工作更接近实际。我简化了一些事情,添加了一个小的测试驱动程序,并添加了一个<code>__iter__</code>,它使用一个生成器依次生成每个节点的数据,这样<code>for i in self</code>(in <code>myList.__repr__</code>)可以工作。差异:</p>
<pre><code> - a/user1337598.py
+++ b/user1337598.py
@@ -1,4 +1,4 @@
-class Node:
+class Node(object):
def __init__(self, data=None, next=None):
self.data = data
self.next = next
@@ -19,27 +19,36 @@ class Node:
return str(self.data)
def __repr__(self):
- return "Node(%s, %s)" % (repr(self.data), repr(self.next))
+ return "Node(%r, %r)" % (self.data, self.next)
def __eq__(self, other):
return self.data == other.data and self.next == other.next
-class myList:
+class myList(object):
def __init__(self):
- self.first = Node()
+ self.first = None
def add(self, data):
- newNode = Node() # create a new node
- newNode.data = data
- newNode.next = self.first # link the new node to the 'previous' node.
+ newNode = Node(data, self.first) # create a new node
self.first = newNode # set the current node to the new one
- def first(self):
+ def getFirst(self):
return self.first.data
+ def __iter__(self):
+ node = self.first
+ while node is not None:
+ yield node.data
+ node = node.next
def __repr__(self):
plist = []
for i in self:
plist.append(i)
return "LinkedList(%s)" % str(plist)
+
+if __name__ == '__main__':
+ lst = myList()
+ lst.add(1)
+ lst.add(2)
+ print repr(lst)
</code></pre>
<p>请注意,<code>repr</code>使用名称<code>LinkedList</code>,即使类名是<code>myList</code>。我通常编写<code>repr</code>函数来使用<code>self.__class__.__name__</code>,例如:</p>
^{pr2}$
<p>它还允许基类<code>__repr__</code>为派生类工作(有时在派生类的帮助下)。在</p>