dunders是方法还是函数?

2024-06-02 06:12:46 发布

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

我对像__iter__()__next__()这样的方法的使用有点困惑(我想它们被称为dunders)。 我试图理解迭代器和iterables,并编写了以下代码:

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

有谁能告诉我如何将它们同时用作方法和函数?它是否适用于所有Dunder


Tags: 方法函数代码nexthasprinttryexcept
1条回答
网友
1楼 · 发布于 2024-06-02 06:12:46
  • 如果您正在编写自己的类,并且希望它支持迭代,那么为它编写一个__iter__方法
  • 如果您使用的是支持迭代的类,那么就调用iter函数(或者,在大多数情况下,您不需要太多控制,只需在for循环中使用它)

这不仅适用于这一对,还适用于其他dunder方法和相关函数,例如len()__len__()

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

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

相关问题 更多 >