Нави Гатор
Спасибо. Про monkeypatch_query_method то я знаю, именно из него вызывается setattr, но насколько я понял метод select_by он вытаскивает прямо из Query. А как бы его заставить цеплять свой select_by? Все-таки сырцы sqlalchemy менять как-то не хочется.
Это то, что ты хотел?
from elixir import *
from elixir.entity import EntityMeta
metadata.connect(“sqlite:///sample.sqlite”)
class SelectDescr(object):
    def __init__(self, cls, fixed_name):
        self._cls = cls
        self._old_select_by = cls.select_by
        self._fixed_name = fixed_name        
    def __get__(self, instance, owner):
        def f(*args, **kwargs):
            new_kw = dict()
            new_kw.update(kwargs)
            if self._fixed_name is not None:
                new_kw = self._fixed_name
            return self._old_select_by(instance, *args, **new_kw)
        return f
class PersonMeta(EntityMeta):
    def __init__(cls, name, bases, dict_):
        EntityMeta.__init__(cls, name, bases, dict_)
        cls.select_by = SelectDescr(cls, getattr(cls, ‘fixed_name’, None))        
class Person(Entity):
    __metaclass__ = PersonMeta
    has_field('name', Unicode(255))
    def __repr__(self):
        return ‘Person @ 0x%08x (%s)’%(id(self), self.name)
#instrument(Person)
#Person.select_by = SelectDescr(Person)
drop_all()
create_all()
def fill():
    p = Person(name='Jack')
    p2 = Person(name='John')
    objectstore.flush()
fill()
print Person.select_by()
print Person.select_by(name='Jack')
class Jack(Person):
    fixed_name = ‘Jack’
print Jack.select_by()
Если нет - давай отталкиваться от примера и выяснять, что таки нужно.