前言
前面我自己写了一个对链表对象的封装,现在看来,确实还得是大佬的封装思路更加完善
前言知识介绍
__init__方法
__init__方法是Python中的一个特殊方法,用于初始化一个新对象。当一个类的实例被创建时,__init__方法会被自动调用,用来对实例的属性进行初始化。这个方法可以接受参数,用来为实例的属性赋初值。通过__init__方法,可以确保实例在创建时具有必要的属性值,从而使得实例能够在被创建后立即可用。
__next__方法
1.__next__方法通常与迭代器对象的__iter__方法一起使用,以便在循环中使用迭代器对象。当循环遍历迭代器对象时,实际上是在调用迭代器对象的__next__方法来获取每个元素,直到StopIteration异常被触发。 2.总之,__next__方法的作用是实现迭代器对象的遍历行为,使得迭代器对象可以在循环中使用。
__iter__方法
1.__iter__是一个特殊方法,用于定义一个对象是可迭代的。当对象实现了__iter__方法时,它就可以被用于迭代,如在for循环中使用。 2.__iter__方法应该返回一个迭代器对象,通常是实现了__next__方法的对象。这个迭代器对象可以是自身,也可以是另一个对象,只要它实现了__next__方法。 3.总之,__iter__方法的作用是定义对象是可迭代的,并且返回一个迭代器对象,使得对象可以在for循环中使用。
__repr__方法
1.__repr__是Python中的一个特殊方法,用于返回对象的字符串表示形式。它通常用于调试和日志记录,以便在打印对象时能够清晰地看到对象的信息。 2.当调用内置函数repr()时,它会调用对象的__repr__方法来获取对象的字符串表示形式。如果一个对象没有实现__repr__方法,那么会调用默认的__repr__方法,它会返回对象的类名和内存地址的字符串表示形式。 3.__repr__方法的主要目的是提供对象的一种可读性良好的字符串表示形式,以便在调试和日志记录时能够清晰地看到对象的信息。因此,通常在实现自定义类时会重写__repr__方法,以便返回有意义的字符串表示形式。
代码实现
class LinkList:
class Node: # 创建一个结点类
def __init__(self, item=None):
self.item = item
self.next = None
class LinkListIterator: # 此对象为链表的迭代对象
def __init__(self, node):
self.node = node
def __next__(self):
"""
__next__方法通常与迭代器对象的__iter__方法一起使用,以便在循环中使用迭代器对象。当循环遍历迭代器对象时,
实际上是在调用迭代器对象的__next__方法来获取每个元素,直到StopIteration异常被触发。
总之,__next__方法的作用是实现迭代器对象的遍历行为,使得迭代器对象可以在循环中使用。
:return:
"""
head_node=self.node
if self.node:
cur_node = self.node
self.node = cur_node.next
return cur_node.item
else:
self.node=head_node # 重新将链表的移动结点归为头结点
raise StopIteration
def __iter__(self):
"""
__iter__是一个特殊方法,用于定义一个对象是可迭代的。当对象实现了__iter__方法时,它就可以被用于迭代,如在for循环中使用。
__iter__方法应该返回一个迭代器对象,通常是实现了__next__方法的对象。这个迭代器对象可以是自身,也可以是另一个对象,只要它实现了__next__方法。
总之,__iter__方法的作用是定义对象是可迭代的,并且返回一个迭代器对象,使得对象可以在for循环中使用。
:return:
"""
return self
def __init__(self, iterable=None):
"""
:param iterable:此为传入的列表
"""
self.head = None
self.tail = None
if iterable:
self.extend(iterable) # 有点类似的定义了一个列表中的extend方法
def append(self, obj):
s = LinkList.Node(obj) # 创建一个节点对象
if not self.head: # 如果此链表中还不存在结点
self.head = s
self.tail = s
else:
self.tail.next = s # 将链表节点对象置于尾节点后方,并且将尾节点指向最后插入的结点对象
self.tail = s
def extend(self, iterable):
"""
:param iterable:传入一个列表
:return:
"""
for obj in iterable:
self.append(obj) # 调用append方法,将传入列表中的每一个元素以链表节点的形式存入
def find(self, obj):
for n in self:
if n == obj:
print(n)
return True
else:
print(n)
def __iter__(self):
return self.LinkListIterator(self.head)
def __repr__(self):
"""
1.__repr__是Python中的一个特殊方法,用于返回对象的字符串表示形式。它通常用于调试和日志记录,以便在打印对象时能够清晰地看到对象的信息。
2.当调用内置函数repr()时,它会调用对象的__repr__方法来获取对象的字符串表示形式。如果一个对象没有实现__repr__方法,那么会调用默认的__repr__方法,它会返回对象的类名和内存地址的字符串表示形式。
3.__repr__方法的主要目的是提供对象的一种可读性良好的字符串表示形式,以便在调试和日志记录时能够清晰地看到对象的信息。因此,通常在实现自定义类时会重写__repr__方法,以便返回有意义的字符串表示形式。
:return:
"""
return "<<" + ",".join(map(str, self)) + ">>"
if __name__ == '__main__':
lk = LinkList([1, 2, 3, 4, 5])
for element in lk:
print(element)
print(lk)
print(lk.find(3))