Skip to main content
 首页 » 编程设计

python之直接在创建的类上调用函数 'list(...)'

2025年05月04日15pander-it

我知道在 Python 类创建过程中可以重载一些特定的功能,这样当在创建的对象上调用一些 Python 的内置函数时,它们能够正确地对它们进行操作,即。

class Node(object):     
    def __init__(self, contents=None,leftNode=None, rightNode=None): 
        super(Node, self).__init__() 
        self.__leftNode = leftNode 
        self.__rightNode= rightNode 
        self.__contents = contents 
 
    # OverLoad the str function. Prints the address of the Node, and it's contents. 
    def __str__(self):   
        addr=repr(self).split(' ')[-1][:-1] 
        return str('Addr: {0}\tContents: {1}'.format(addr, self.__contents)) 

这允许漂亮地打印在节点对象上调用 print 或 str(...) 时输出的数据。我想知道的是,如果有一种方法可以对 list(...) 做同样的事情,如果我要传递一个已实现的链表对象,它将能够返回一个 python 列表实现,这只会将所有节点内容附加到列表中,然后返回它。

我知道这听起来有点简单,而且没有必要,但即将生成一个二叉树类实现,并且希望能够自己生成一个堆排序能力列表。我试图实现 iter 属性,但只是着手创建一个奇怪的无限循环。

编辑

链接到 LinkedListData 类型的完整实现:​​Linked List Gist .

本身与 Python 的链表之间的主要区别是更容易附加到列表的任何一侧,并且能够启用类型安全,这可以通过从一开始就在列表中指示类型来打开。添加了 @Leva7 提供的实现提示。 因为这是我的第一个“纯”数据结构,所以关于最佳实践的任何提示,没有 DocStrings 都会更加熟悉这些,我们将不胜感激和欢迎,代码库中的低效率也是如此。

请您参考如下方法:

这是通过实现 __iter__ 方法来完成的。列表构造函数将使用它来迭代您的对象并从中创建一个列表。请记住,它应该是一个生成器方法,而不是返回一个列表。

例子:

class Test: 
    def __iter__(self): 
        for i in range(5): 
            yield i 
 
ls = list(Test()) 
print(ls) 

输出将是:

[0, 1, 2, 3, 4] 

在您的情况下,您将获取第一个节点,直到结束(在您的实现中以某种方式标记)您产生下一个节点,所以类似这样:

def __iter__(self): 
    curr_node = self 
    while curr_node.__not_last: 
        yield curr_node.__contents 
        curr_node = curr_node.__rightNode 

为此,您需要在 Node 对象中添加一个 __not_last bool 属性

供将来引用,here是OP的全链表实现