我正在尝试使用下面的代码(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
答案 0 :(得分:5)
如果我正确读取this source,似乎在定义类时设置了迭代器。我可能会读错了。我猜这是为了快速查找next
函数(将其设置为slot),因为它在循环等中使用。
鉴于此,以下似乎就是你所追求的:
>>> test.__class__.next = type(test.__class__.next)(new_next, test, test.__class__)
>>> next(test)
2