__next\uuu和next with arguments

2024-04-29 17:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个双链表的实现。为了遍历列表,我使用了类似于:

class Node:
    """ A node in our linked list """
    def __init__(self, value: Any, next: Union['Node', None] =None,
            previous: Union['Node', None] =None) -> None:
        self.value = value
        self.next = next
        self.previous = previous

    ...

    def __next__(self, direction: int =1) -> Union['Node', None]:
        if direction == 1:
            return self.get_next()
        else:
            return self.get_previous()

    ...

其中get_next和{}只是self.next和{}的getter。在

但是,PyCharm因为我想打电话给next而对我大喊大叫 next(some_node, direction=-1)。正确的方法是什么?在


Tags: selfnonenode列表getreturnvaluedef
3条回答

__next__是{a1}的一部分,应该按照上述协议中的描述使用,否则只会对rest python产生问题。在

在您的例子中,只需将函数重命名为simple next,并使用as some_node.next(-1),不过我会将direction参数更改为布尔值,正如您使用它的方式一样,以及它的名称。比如这样

class None: 
    ...

    def next(self, forward:bool=True) -> Union['Node', None]:
        if forward:
            return self.get_next()
        else:
            return self.get_previous()

并用作some_node.next()some_node.next(False)甚至some_node.next(0)(使用0代替False以获得相同的效果)

除了__iter__还有{}。两者都需要返回iterators__next__方法应该在iterators上实现(而不是在节点类上)。请注意,所有魔术方法(当由next之类的函数调用而不是直接调用时)都需要实现预期的参数而不是更多,而不是更少。在

例如,双链接列表可以实现__iter__和{},并依赖于节点的next和{}属性:

class Node(object):
    def __init__(self, val, nxt, prv):
        self.val = val
        self.nxt = nxt
        self.prv = prv


class DoublyLinkedList(object):
    def __init__(self, base=None, last=None):
        self.base = base
        self.last = last

    def prepend(self, val):
        new = Node(val, self.base, None)
        if self.base is None:
            self.base = new
            self.last = new
        else:
            self.base.prv = new
            self.base = new

    def append(self, val):
        new = Node(val, None, self.last)
        if self.last is None:
            self.base = new
            self.last = new
        else:
            self.last.nxt = new
            self.last = new

    def __iter__(self):
        current = self.base
        while current is not None:
            yield current
            current = current.nxt

    def __reversed__(self):
        current = self.last
        while current is not None:
            yield current
            current = current.prv

例如:

^{pr2}$

给出:

30
20
10

reversed相似:

for i in reversed(dl):
    print(i.val)

# prints:
10
20
30

next的额外参数是默认值,__next__不接受任何额外参数。Python没有任何双向迭代器。如果您的接口与for i in obj:不完全相同,那么您应该编写自己的接口。在

相关问题 更多 >