adding methods at runtime
Bruno Desthuilliers
bruno.42.desthuilliers at wtf.websiteburo.oops.com
Fri Jan 11 06:00:44 EST 2008
zslevi at gmail.com a écrit :
> Can I access the class attributes from a method added at runtime?
Of course.
> (My
> experience says no.)
So there's something wrong with your experience !-)
> I experimented with the following code:
>
>
> class myclass(object):
> myattr = "myattr"
>
> instance = myclass()
> def method(x):
> print x
>
> instance.method = method
As Marc pointed out, you're not adding a method but a function. What you
want is:
def method(self, x):
print "x : %s - myattr : %s" % (x, self.myattr)
import new
instance.method = new.instancemethod(method, instance, myclass)
Note that this is only needed for per-instance methods - if you want to
add a new method for all instances, you just set the function as
attribute of the class. The lookup mechanism will then invoke the
descriptor protocol on the function object, which will return a method
(FWIW, you have to do it manually on per-instance methods because the
descriptor protocol is not invoked on instance attributes, only on class
attributes).
HTH
More information about the Python-list
mailing list