2017-01-05 111 views
8

我試圖用下面的代碼覆蓋對象的下一個函數(python 2.7)。覆蓋實例的下一個功能

當對象的next方法被直接調用時,調用新函數。但是,當我在我的對象上調用內置函數next()(其中according to the docs應該調用實例的下一個方法)時,會調用原始函數。

有人可以解釋這種行爲嗎?

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

有趣。可能與[PEP 3114](https://www.python.org/dev/peps/pep-3114)有關? –

+0

@AndréLaszlo看起來像PEP是Python 3 – warvariuc

+0

@warvariuc糟糕,你是對的。 –

回答

5

如果我正確讀取this source,似乎在類定義時設置了迭代器。但我可能讀錯了。因爲它在給定環等

使用我猜這是爲next功能快速查找(其設置爲slot),如下所示的似乎做你以後:

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

謝謝!當我動態地創建一個繼承自Test的類並覆蓋下一個方法時,我實際上最終採用了不同的方法。這樣我就不會改變原來的課程。 – Tzach

+0

聽起來更安全一些,而不是依靠一些無證的行爲和一些傢伙猜測這麼:)非常有趣,但感謝張貼。 –

+2

http://stackoverflow.com/questions/34490998/why-typex-enter-x-instead-of-x-enter-in-python-standard-context/34491119#34491119 https://docs.python.org /3/reference/datamodel.html#special-method-lookup – warvariuc