是dunder方法或函数吗?

时间:2020-08-02 09:33:23

标签: python python-3.x magic-methods

我对使用__iter__()__next__()之类的方法感到有些困惑(我想它们被称为dunders)。 我试图理解迭代器和可迭代对象,并编写了以下代码:

x = (1, 2, 3, 4, 5, 6)
try:
    y = x.__iter__()
    while 1:
        print(y.__next__())
except StopIteration:
    print('Iterator has exhausted')

然后,当我将__iter____next__用作函数时,代码可以正确执行:

x = (1, 2, 3, 4, 5, 6)
try:
    y = iter(x)
    while 1:
        print(next(y))
except StopIteration:
    print('Iterator has exhausted')

有人可以告诉我如何将它们既用作方法又用作函数?并适用于所有邓雷吗?

1 个答案:

答案 0 :(得分:0)

  • 如果您要编写自己的类并希望它支持迭代,请为其编写一个__iter__方法。
  • 如果您使用的是支持迭代的类,请调用iter函数(或者,在大多数情况下,您不需要太多控制,只需在for循环中使用它即可)。

这不仅适用于此特定对,还适用于其他dunder方法和相关功能,例如len()__len__()

在后台,iter函数仅调用传递给它的对象的__iter__方法。您可能会问:为什么要拥有一个iter函数,而您却可以自己调用__iter__方法呢? (也许那是您真正想知道的。)我有两个原因可以想到:

  • 如果要调用没有下划线的函数,它会使代码看起来更整洁。
  • 通常使用这对内置函数对和关联的dunder方法,内置函数实际上会处理一些不同的细节。 iter就是这样的一个例子:就像docs所说的那样,它不仅适用于具有__iter__方法的类型,而且适用于满足容器协议的类型(即__len____getitem__方法)。
  • (此外,这些下划线旨在表示您并非直接调用该方法,但是当您已经问到为什么不直接调用它们时,这种解释就有点循环了。)