2017-01-05 9 views
8

मैं नीचे दिए गए कोड (पायथन 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

दिलचस्प। [पीईपी 3114] से संबंधित हो सकता है (https://www.python.org/dev/peps/pep-3114)? –

+0

@ एंड्रेलास्लो ऐसा लगता है कि पीईपी पाइथन 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

धन्यवाद! मैं वास्तव में एक अलग दृष्टिकोण के साथ समाप्त हुआ, जब मैं गतिशील रूप से एक वर्ग बनाता हूं जो टेस्ट से विरासत में मिलता है, और वहां अगली विधि को ओवरराइड करता है। इस तरह मैं मूल वर्ग नहीं बदल रहा हूं। – Tzach

+0

किसी भी तरह से सुरक्षित नहीं लगता है, कुछ अनियंत्रित व्यवहार पर निर्भर होने के बजाय और कुछ लोग SO पर आधा अनुमान लगाते हैं :) बहुत दिलचस्प हालांकि, पोस्टिंग के लिए धन्यवाद। –

+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

संबंधित मुद्दे