2010-12-06 15 views
6

की जगह मैं कोड है जो उस में निम्नांकित दो पंक्तियों को शामिल है: -'नई' मॉड्यूल

instanceMethod = new.instancemethod(testFunc, None, TestCase) 
setattr(TestCase, testName, instanceMethod) 

कैसे कर सकता है यह किया 'नई' मॉड्यूल का उपयोग किए बिना फिर से लिखा? मुझे यकीन है कि नई शैली के वर्ग इस के लिए कुछ प्रकार का कामकाज प्रदान करते हैं, लेकिन मुझे यकीन नहीं है कि कैसे।

उत्तर

2

यह thread देखें (अपडेट किया गया: मूल साइट हटा दी गई थी)।

+0

पहले टिप्पणी की है कि मैं टूटे हुए लिंक के किसी भी संदर्भ नहीं मिला, लेकिन यहाँ यह है: http: // python.6.n6.nabble.com/replacement-for-new-instancemethod-in-Python3-tt1546046.html#none हालांकि इसमें अधिक जानकारी नहीं है, हालांकि, मैं गलत हो सकता हूं। – geertjanvdk

+0

क्षमा करें, यह मेरे हिस्से में गलत था। फिर से मतदान किया! – geertjanvdk

9

एक चर्चा है जो बताती है कि अजगर 3 में, यह आवश्यक नहीं है। अजगर 2.6 में एक ही काम करता है

देखें:

>>> class C: pass 
... 
>>> c=C() 
>>> def f(self): pass 
... 
>>> c.f = f.__get__(c, C) 
>>> c.f 
<bound method C.f of <__main__.C instance at 0x10042efc8>> 
>>> c.f 
<unbound method C.f> 
>>> 

हर एक के लाभ के लिए प्रश्न दोहराते, मेरा भी शामिल है।

क्या new.instancemethod के लिए Python3 में कोई प्रतिस्थापन है? यही है, एक मनमाना उदाहरण दिया गया है (इसकी कक्षा नहीं) मैं इसे एक विधि के रूप में एक नया उचित रूप से परिभाषित कार्य कैसे जोड़ सकता हूं?

तो पर्याप्त होना चाहिए निम्नलिखित:

TestCase.testFunc = testFunc.__get__(None, TestCase) 
+1

'c.f' का मान' <__ मुख्य __। सी उदाहरण के 0x10042efc8 >> '' 'unbound method C.f> 'पर इंटरैक्टिव शैल में दूसरी पहुंच पर' <बाध्य विधि सीएफ से बदलता क्यों है? जब मैं कोशिश करता हूं तो यह मेरे लिए नहीं होता है। – martineau

1

यह भी ऐसा ही होगा:

>>> Testcase.testName = testFunc 

हाँ, यह वास्तव में इतना आसान है।

आपका लाइन

>>> instanceMethod = new.instancemethod(testFunc, None, TestCase) 

(हालांकि सिद्धांत रूप में नहीं) एक NOOP व्यवहार में है। :) तुम बस के रूप में अच्छी तरह से

>>> instanceMethod = testFunc 

वास्तव में, अजगर 3 में मैं बहुत यकीन है कि यह रूप में अच्छी तरह सिद्धांत में ही होगा हूँ कर सकता है, लेकिन नए मॉड्यूल तो मैं उस में परीक्षण नहीं कर सकते चला गया है अभ्यास।

0

यह पुष्टि करने के लिए कि Python v2.4 के बाद से new.instancemthod() का उपयोग करने की आवश्यकता नहीं है, यहां एक उदाहरण है कि एक उदाहरण विधि को कैसे बदला जाए। वर्णनकर्ताओं का उपयोग करने की भी आवश्यकता नहीं है (भले ही यह काम करता हो)।

class Ham(object): 
    def spam(self): 
     pass 

h = Ham() 
def fake_spam(): 
    h._spam = True 
h.spam = fake_spam 
h.spam() 

# h._spam should be True now. 

इकाई परीक्षण के लिए सुविधाजनक।

3

आप "types.MethodType" द्वारा "new.instancemethod" की जगह ले सकता:

from types import MethodType as instancemethod 

class Foo: 
    def __init__(self): 
     print 'I am ', id(self) 

def bar(self): 
    print 'hi', id(self) 

foo = Foo() # prints 'I am <instance id>' 
mm = instancemethod(bar, foo) # automatically uses foo.__class__ 
mm()   # prints 'I have been bound to <same instance id>' 

foo.mm  # traceback because no 'field' created in foo to hold ref to mm 
foo.mm = mm # create ref to bound method in foo 
foo.mm()  # prints 'I have been bound to <same instance id>'