How to code dynamically created methods?
kj
socyl at 987jk.com.invalid
Wed Jun 20 09:49:30 EDT 2007
I've tried a bazillion ways to code dynamically generated methods,
to no avail.
The following snippet is a very simplified (and artificial) demo
of the problem I'm running into, featuring my latest attempt at
this. The idea here is to use __getattr__ to trap any attempt to
invoke a nonexistent method, have it return a generic handler called
_auto which creates the new method dynamically, invokes it, and
"installs" it in the class, so that subsequent calls to the same
method go directly to the newly created method, instead of to
__getattr__. It is this last step, the "installation" of the new
method, that is giving me problems.
class A( object ):
def __getattr__( self, name ):
self._auto_name = name
return self._auto
def hello( self, name ):
print "hi! my name is %s" % name
def _auto( self, *args ):
name = self._auto_name
def m( self, *args ): self.hello( name )
m( self, *args )
m = classmethod( m )
setattr( A, name, m )
x = A()
x.foo() # ok
x.foo() # bombs
>>> reload(test) hi! my name is foo Traceback (most recent call
last):
File "<stdin>", line 1, in ? File "test.py", line 19, in ?
x.foo() File "test.py", line 12, in m
self.hello( name ) TypeError: unbound method hello() must be
called with A instance as first argument (got str instance instead)
>>>
I'm sure that the problem is with my naive attempt to add a method
to class A dynamically (in the last two lines of the definition of
_auto). What's the right way to do this?
Thanks!
kj
--
NOTE: In my address everything before the first period is backwards;
and the last period, and everything after it, should be discarded.
More information about the Python-list
mailing list