链表对象的封装

2023-12-20 12:41:17

前言

前面我自己写了一个对链表对象的封装,现在看来,确实还得是大佬的封装思路更加完善

前言知识介绍

__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))



结果展示

文章来源:https://blog.csdn.net/xiaoyang01234/article/details/135104151
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。