operator creation?
Peter Otten
__peter__ at web.de
Fri Mar 10 12:20:41 EST 2006
Gerardo Herzig wrote:
> Lets say i have an DB object, who implements the querys to the database
> trough a method called DBObject.doQuery.
>
> On the other hand, i have 50 sql functions stored in the database. So i
> can call DBObject.doQuery('select * from my_sql_function()')...Ok, what
> do i want to achieve, is some mecanism to be able to call
>
> DBObject.my_sql_function(), but without actually having to declare the
> method called "my_sql_function". May be with creating a `->' operator...
> maybe overrwriting the '.' operator...
That's what __getattr__() is for. It is called when an attribute of the
DBObject instance doesn't exist. The function 'method' defined inside
__getattr__() remembers what the variable sql is bound to on that
particular call ("closure"). Because we update the class with 'method',
instead of __getattr__() subsequent calls will not my_sql_function()
directly.
class DBObject(object):
def doQuery(self, sql):
print "executing", sql
def __getattr__(self, name):
sql = "SELECT * FROM %s();" % name
def method(self):
return self.doQuery(sql)
# insert the new method into the class
# so that it has to be created only once
setattr(self.__class__, name, method)
return getattr(self, name) # infinite recursion
# prevented by prior setattr()
dbo = DBObject()
dbo.my_sql_function()
dbo.my_other_sql_function()
Peter
More information about the Python-list
mailing list