我想传递一个参数来控制产生的数据的大小。 例如,
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)
答案 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)