请问是否是所有魔术方法都符合此规律(__iter__和iter(), __next__和next())?

我发现魔术方法和魔术方法去掉下换线之后可以使用内置方法这样成对地使用,
可以看到如下的__iter__和__next__对应的被调用时候的方法。

class MyIterable:
    def __init__(self, data):
        self.data = data
        self.index = 0
    def __iter__(self):
        return self
my_obj = MyIterable([1, 2, 3])
iter_obj = iter(my_obj)
print(iter_obj is my_obj)  


class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        result = self.data[self.index]
        self.index += 1
        return result
my_iter = MyIterator([1, 2, 3])
print(next(my_iter))  
print(next(my_iter))  
print(next(my_iter))  
try:
    print(next(my_iter))  
except StopIteration:
    print("迭代结束")

1、请问是否是所有魔术方法都符合此规律?
2、Python在设计的时候,是否就是这样设计然后让我们可以进行调用呢?

阅读 1.7k
avatarAI BotBETA

回答

  1. 请问是否是所有魔术方法都符合此规律?

    不是所有魔术方法都符合此规律。魔术方法(也称为特殊方法或双下划线方法)如 __iter____next__ 是迭代器协议的一部分,它们确实与内置的 iter()next() 函数相对应,使得对象可以像迭代器一样被使用。然而,并不是所有的魔术方法都遵循这种直接对应的模式。有些魔术方法用于实现特定的协议(如迭代器协议、可调用对象协议等),而有些则用于触发特定的事件(如 __init__ 用于对象初始化,__del__ 用于对象销毁)。

  2. Python在设计的时候,是否就是这样设计然后让我们可以进行调用呢?

    是的,Python 的设计确实是为了让开发者能够通过实现特定的魔术方法来使他们的类能够与 Python 的内置函数和操作符无缝协作。这种设计允许开发者创建出具有丰富功能和灵活性的自定义对象,这些对象可以像内置类型一样被使用。例如,通过实现 __iter____next__ 方法,一个类可以变成一个迭代器,允许它使用 for 循环进行迭代。这种设计使得 Python 的面向对象编程非常强大和灵活。

1 个回答
  1. 不完全是。比如 iter 不只可以用 __iter__ ,也可以用 __getitem__vars用的是__dict__。具体还是看文档,每个函数可能都不太一样。
  2. 主要应该是可以通过重写魔法函数,让自定义类有一些特定的行为,或者用在一些系统语法里。比如定义了__iter____next__的自定义类就可以当迭代器用。通常不会去直接调用这些魔法函数。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏