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