A __getattr__ for class methods?
Dylan Moreland
dylan.moreland at gmail.com
Wed Feb 8 14:01:37 EST 2006
Michael Spencer wrote:
> Dylan Moreland wrote:
> > I'm trying to implement a bunch of class methods in an ORM object in
> > order to provide functionality similar to Rails' ActiveRecord. This
> > means that if I have an SQL table mapped to the class "Person" with
> > columns name, city, and email, I can have class methods such as:
> >
> > Person.find_by_name
> > Person.find_by_city_and_name
> > Person.find_by_name_and_city_and_email
> >
> > I have a metaclass generating basic properties such as .name and .city,
> > but I don't want to generate a class method for every permutation of
> > the attributes. I'd like to have something much like __getattr__ for
> > instance attributes, so that if a method like
> > Person.find_by_city_and_email cannot be found, I can construct a call
> > to the basic find method that hides the SQL. Is there any way of doing
> > this, ...
>
> Sure, define __getattr__ on the type of the class i.e., the metaclass, just as
> you define it on a class to provide default-attribute-lookup to its instances:
>
> >>> class A(object):
> ... class __metaclass__(type):
> ... def __getattr__(cls, attr):
> ... return "%s.%s" % (cls.__name__, attr)
> ...
> >>> A.somefunc
> 'A.somefunc'
> >>> A.someotherfunc
> 'A.someotherfunc'
> >>>
>
> HTH
>
> Michael
Thanks! I only recently realized that I would have to learn metaclasses
in order to make this work, and I'm still a bit unclear on their
properties.
More information about the Python-list
mailing list