我可以将参数传递给Python中的__iter__函数吗?

时间:2019-01-28 05:21:43

标签: python

我想传递一个参数来控制产生的数据的大小。 例如,

class Something:
    def __init__(self):
        self.all_data = list(range(23))

    def __iter__(self, size):
        random.shuffle(self.all_data)
        batch = list()
        for i in self.all_data:
            batch.append(i)
            if len(batch) >= size:
                yield batch
                batch = list()

a = Something()
for i in a:  # TypeError: __iter__() missing 1 required positional argument: 'size'
    print(i)
for i in a(5):  # TypeError: 'Something' object is not callable
    print(i)

1 个答案:

答案 0 :(得分:1)

您可以通过实现 __ call __ 方法来获得理想的效果,该方法将收集供 __ iter __ 使用的数据,我在 init 中设置了self.size构造函数以确保属性存在。

这不是您想要的,因为它不是直接传递参数而是通过对象的状态传递参数,但是在for i in a(5)的情况下可以使用

请考虑以下情况:有人会for i in a这样使用您的代码,这样可以改变逻辑,例如,您可以检查self.size是否不是 None 。 / p>

import random


class Something:
    def __init__(self):
        self.all_data = list(range(23))
        self.size = 0

    def __iter__(self):
        random.shuffle(self.all_data)
        batch = list()
        for i in self.all_data:
            batch.append(i)
            if len(batch) >= self.size:
                yield batch
                batch = list()

    def __call__(self, n):
        self.size = n
        return self


a = Something()

for i in a(0):
    print(i)