动态添加len方法?

时间:2019-04-15 00:05:52

标签: 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()

1 个答案:

答案 0 :(得分:0)

定义一个保存长度的属性,并返回select * , ABS(P_PRICE - avg(P_PRICE)) as Difference from product; 的长度。

__len__