python - 动态添加len方法?

标签 python reflection

如何以 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()

最佳答案

定义一个保存长度的属性并为 __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

关于python - 动态添加len方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681135/

相关文章:

python - 使用 html5lib 将 HTML 片段转换为纯文本

python - 如何在 Pycharm 中启用自动缩进?

python - 为什么 numpy.dot() 抛出 ValueError : shapes not aligned?

Python 非循环方式根据行和列位置更改数组值

python - scipy.sparse_matrix 中元素的批量归零

objective-c - 在 Obj-C 中发现给定类的子类

c# - 查找包含闭包/lambda 的函数的属性

reflection - 如何获取Kotlin构造函数参数的KClass

c# - 通过反射设置索引值给了我 TargetParameterCountException

c# - 我们可以在运行时创建一个类的实例并通过代码调用类的所有方法吗?