覆盖实例下一个函数

时间:2017-01-05 15:03:54

标签: python

我正在尝试使用下面的代码(python 2.7)覆盖对象的下一个函数。

直接调用对象的next方法时,将调用新函数。但是当我在我的对象上调用内置next()函数(according to the docs,应该调用实例的下一个方法)时,会调用ORIGINAL函数。

有人可以解释这种行为吗?

class Test(object):
    def __iter__(self):
        return self
    def next(self):
        return 1

test = Test()
def new_next(self):
    return 2

test.next = type(test.__class__.next)(new_next, test, test.__class__)
print test.next() # 2
print next(test) # 1

1 个答案:

答案 0 :(得分:5)

如果我正确读取this source,似乎在定义类时设置了迭代器。我可能会读错了。我猜这是为了快速查找next函数(将其设置为slot),因为它在循环等中使用。

鉴于此,以下似乎就是你所追求的:

>>> test.__class__.next = type(test.__class__.next)(new_next, test, test.__class__)
>>> next(test)
2