Ricardo Aráoz wrote: > So lets take it a notch up. > Wanted to change the mfunc method but ONLY for an instance, not a class: > >>>> MyObj = MyClass() >>>> MyObj.mfunc(data) > pre change behavior >>>> MyObj.mfunc = newfunc >>>> MyObj.mfunc(data) > Traceback (most recent call last): > File "<input>", line 1, in <module> > TypeError: newfunc() takes exactly 2 arguments (1 given)
I believe the correct way to do this is to use the __get__() method of the function object to create a bound method and assign that to the instance attribute: In [13]: class MyClass(object): pass ....: In [14]: myObj = MyClass() In [15]: def newfunc(self): ....: print 'post change behavior' ....: ....: All functions are descriptors. The __get__() method returns a bound method: In [16]: newfunc.__get__? Type: method-wrapper Base Class: <type 'method-wrapper'> String Form: <method-wrapper '__get__' of function object at 0x20a6cb0> Namespace: Interactive Docstring: descr.__get__(obj[, type]) -> value In [17]: newfunc.__get__(myObj, MyClass) Out[17]: <bound method MyClass.newfunc of <__main__.MyClass object at 0x20ba950>> Assigning the bound method to myObj.mfunc has the desired behaviour: In [18]: myObj.mfunc = newfunc.__get__(myObj, MyClass) In [19]: myObj.mfunc() post change behavior I have a writeup of descriptors here: http://personalpages.tds.net/~kent37/kk/00008.html You can also use types.MethodType to do the same thing: In [20]: from types import MethodType In [21]: MethodType(newfunc, myObj, MyClass) Out[21]: <bound method MyClass.newfunc of <__main__.MyClass object at 0x20ba950>> Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor