2010-12-06 12 views
6

Ich habe Code, der die folgenden zwei Zeilen in es enthält: -die „neue“ Modul ersetzen

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

Wie kann es ohne Verwendung die „neue“ Modul neu geschrieben werden? Ich bin sicher, dass neue Stilklassen eine Art Workaround dafür bieten, aber ich bin mir nicht sicher, wie.

Antwort

2

Überprüfen Sie diese thread (aktualisiert: die ursprüngliche Website wurde gelöscht).

+0

früher kommentiert, dass ich keinen Hinweis auf den Defekten Link gefunden haben, aber hier ist es: http: // python.6.n6.nabble.com/replacement-for-new-instancetheth-in-Python3-tt1546046.html#none Es enthält nicht zu viele Informationen, obwohl ich falsch liegen könnte. – geertjanvdk

+0

Entschuldigung, das war falsch von meiner Seite. Wieder abgestimmt! – geertjanvdk

9

Es gibt eine Diskussion, die darauf hinweist, dass dies in Python 3 nicht erforderlich ist. Das gleiche funktioniert in Python 2,6

See:

>>> 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> 
>>> 

die Frage für jeden Nutzen des einen erneuten Ausdruck, einschließlich mir.

Gibt es einen Ersatz in Python3 für neue.Instancemethode? Das heißt, bei einer beliebigen Instanz (nicht ihrer Klasse), wie kann ich eine neue, entsprechend definierte Funktion als Methode hinzufügen?

folgende So genügen sollte:

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

Warum änderte sich der Wert von 'c.f' von' > 'nach' 'beim zweiten Zugriff in der interaktiven Shell? Es ist nicht für mich, wenn ich es versuche. – martineau

1

Dies das Gleiche tun wird:

>>> Testcase.testName = testFunc 

Ja, es ist wirklich so einfach ist.

Ihre Linie

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

ist in der Praxis (wenn auch nicht in der Theorie) ein noop. :) Man könnte genauso gut

>>> instanceMethod = testFunc 

In der Tat, in Python 3 Ich bin ziemlich sicher, würde es auch das gleiche in der Theorie, aber das neue Modul ist weg, so kann ich es nicht getestet in trainieren.

0

Um zu bestätigen, dass es nicht nötig ist, new.instancemethod() seit Python v2.4 zu verwenden, hier ein Beispiel, wie man eine Instanzmethode ersetzt. Es ist auch nicht notwendig, Deskriptoren zu verwenden (obwohl es funktioniert).

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. 

Handlich für Komponententests.

3

Sie können „new.instancemethod“ durch „types.MethodType“ ersetzen:

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>' 
Verwandte Themen