generating method names 'dynamically'

Daniel Nogradi nogradi at gmail.com
Thu Jan 26 19:20:52 EST 2006


> > Is it possible to have method names of a class generated somehow
> dynamically?
> >
> > More precisely, at the time of writing a program that contains a class
> > definition I don't know what the names of its callable methods should
> > be. I have entries stored in a database that are changing from time to
> > time and I always want to be able to call (from another program) those
> > method names which are at the moment present in the database.
>
> Sounds somehow more like all you need is to learn about __getattr__ and
> maybe __call__ instead of actually generating methods.  In other words,
> don't generate anything, just intercept attempts to call things that
> were produced by accessing the attributes of an object.
>
> Whether that would work or not depends on things you haven't said.  The
> above spec is a little unclear, given among other things that you don't
> "call method names", that the code in the methods you would presumably
> want to call has to exist somewhere and you haven't described what that
> code would be, and I can't tell what those database "entries" are really
> all about other than that they somehow refer to the names of things that
> you think you want to call as methods. :-)
>
> Perhaps an example is in order...
>

Thanks for all the replies, it became clear that I need to look into
getattr, __getattr__ and __call__. I'll do that, but since you asked,
here is the thing I would like to do in a little more detail:

My database has 1 table with 2 fields, one called 'name' and the other
one called 'age', let's suppose it has the following content, but this
content keeps changing:

Alice 25
Bob  24

----------- program1.py ----------------

class klass:

     # do the stuff with getattr using the database
     # but in a way that after the database changes
     # I don't need to rewrite this part


inst = klass()

---------- program2.py ------------------

import program1

# This should print 'Hello, my name is Bob and I'm 24'
program1.inst.Bob()

# This should print 'Hi, I'm 25 and I'm Alice'
program1.inst.Alice()

# This should print an error message, since there is no
# field in the database with name=John
program1.inst.John()



More information about the Python-list mailing list