python如何制作;“用于迭代”;停在";“len”;使用dunder方法
我有几个Python类用于调用C-code,使用python如何制作;“用于迭代”;停在";“len”;使用dunder方法,python,magic-methods,Python,Magic Methods,我有几个Python类用于调用C-code,使用C-types。return结构类似于下面的示例 import ctypes class MyCClass(ctypes.Structure): _fields_ = [('n_values', ctypes.c_int),\ ('values', ctypes.c_double * 5)] def __repr__(self): return """n_values : {0},
C-types
。return结构类似于下面的示例
import ctypes
class MyCClass(ctypes.Structure):
_fields_ = [('n_values', ctypes.c_int),\
('values', ctypes.c_double * 5)]
def __repr__(self):
return """n_values : {0}, values : {1}""".format(self.n_values,\
self.values)
def __len__(self):
return self.n_values
def __getitem__(self, key):
return self.values[key]
values
数组的大小是固定的,以简化对C的调用(这里不选择使用可变大小的数组)。数组的“实际”长度由n_值
变量控制
例如,如果值
是由三个数字组成的数组,例如1
、2
和3
,值=[1,2,3,0,0]
和n_值=3
这一切都很好。问题是当我实现\uu len\uu
和\uu getitem\uu
时
我希望能够编写这样的代码
for value in my_class:
#do something
但是迭代器似乎没有“得到”值
-数组只有n_值
长。也就是说,它似乎没有使用MyCClass.\uu____
来停止迭代。相反,它似乎在值的整个长度上迭代
my_class = MyCClass()
my_class.n_values = 3
sample_values = [1, 2, 3]
for i in range(3):
my_class.values[i] = sample_values[i]
i = 0
for value in my_class:
print(i)
i += 1
0
1
2
3
4
我想要
i = 0
for value in my_class:
print(i)
i += 1
0
1
2
我知道我会编码
for i in range(my_class):
# do something with my_class[i]
但这不是我想要的
有人知道如何解决这个问题吗?对于老式的迭代器类型,唯一的方法是生成一个索引器:
def __getitem__(self, key):
if key >= len(self):
raise IndexError
return self.values[key]
对于一个更干净的解决方案,考虑使用更现代的迭代协议,即从迭代中定义的<代码>返回到一个迭代器实例。这是有文档记录的。
对于老式的迭代器类型,唯一的方法是生成一个索引器
:
def __getitem__(self, key):
if key >= len(self):
raise IndexError
return self.values[key]
对于一个更干净的解决方案,考虑使用更现代的迭代协议,即从迭代中定义的<代码>返回到一个迭代器实例。这是有文档记录的。
在MyCClass中定义一个\uu iter\uuuu
方法。是的,因为“旧的”基于getitem的迭代器协议一直运行,直到遇到索引器。只需使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu基于getitem的迭代器协议一直运行,直到遇到索引器
。只需使用\uuuuu iter\uuuuuu
和生成器实现迭代器协议,或者使用实现\uuuuuuu iter\uuuuu
(返回self)和\uuuuuuu next\uuuuu
的自定义迭代器类即可