Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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方法?_Python_Reflection - Fatal编程技术网

Python 动态添加len方法?

Python 动态添加len方法?,python,reflection,Python,Reflection,如何以len(…)喜欢的方式将len(…)添加到现有对象 用例是以一种不需要在迭代站点之间编写/更改代码的方式记住生成器在第一次迭代之后的长度 以下是我到目前为止的情况: def generator2iterator(generator): class Iterator(object): def __iter__(self): i = 0 for e in generator(): i +=

如何以
len(…)
喜欢的方式将
len(…)
添加到现有对象

用例是以一种不需要在迭代站点之间编写/更改代码的方式记住生成器在第一次迭代之后的长度

以下是我到目前为止的情况:

def generator2iterator(generator):
    class Iterator(object):
        def __iter__(self):
            i = 0
            for e in generator():
                i += 1
                yield e
            #self.__len__ = types.MethodType(lambda self: i, self)
            self.__len__ = (lambda self: i).__get__(self)
    return Iterator()

def test_generator():
    yield 3

iterator = generator2iterator(test_generator)

print(list(iterator))
# [3]

print(iterator.__len__())
# 1

print(len(iterator))
# TypeError: object of type 'Foo' has no len()

定义一个保存长度的属性,并返回
的长度

def generator2iterator(generator, length=None):
    class Iterator(object):
        def __iter__(self):
            for i, e in enumerate(generator(), 1):
                self._len = i
                yield e
            #self.__len__ = types.MethodType(lambda self: i, self)

        def __len__(self):
            if not hasattr(self, '_len'):
                raise TypeError("object of type 'Iterator' has no defined len() yet.")
            return self._len
    return Iterator()

# examples:
## define a generator with 10 elements
def g():
    for i in range(10):
        yield i

# pass it to the iterator
it = generator2iterator(g)

# check len
len(it)
TypeError: object of type 'Iterator' has no defined len() yet.

# run the iterator
for _ in it:
    pass

# check the length
len(it)
# returns:
10

然后会有一段时间,
len(it)
给出了错误的答案。你不能总是提前确定发电机的长度。你能给出一个预期输出的例子吗?我希望在第一次迭代之前不要定义
\uuu len\uuu
(对
len
的调用应该失败),在第一次迭代之后,我们知道生成器的长度——所以(可能)动态地添加方法。哦!在这种情况下,请删除
\uuuu init\uuu
的定义并引发错误。查看我的更新