Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何制作;“用于迭代”;停在";“len”;使用dunder方法_Python_Magic Methods - Fatal编程技术网

python如何制作;“用于迭代”;停在";“len”;使用dunder方法

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},

我有几个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}, 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
的自定义迭代器类即可