Python - метод класса в базовом классе, доступный через дочерний класс, без перехода в класс

Я пытаюсь определить некоторые методы в базовом классе, которые затем могут быть использованы как классовые / статические методы в дочернем классе, например, так:

class Common():
    @classmethod
    def find(cls, id): # When Foo.find is called, cls needs to be Foo
        rows = Session.query(cls)
        rows = rows.filter(cls.id == id)
        return rows.first()

class Foo(Common):
    pass

>> Foo.find(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: find() takes exactly 2 arguments (1 given)

Как я могу определить find в Common такой, что его можно использовать в Foo без необходимости переопределять его в Foo или сделать проход в Foo к методу в Common? Я тоже не хочу звонить Foo.find(Foo, 3), Я использую Python 2.6.

Редактировать: сумасшедший, похоже, у меня был другой find объявлено в Common что я не заметил, и это вызывало TypeError, Я бы удалил этот вопрос, но Никс упомянул о запахах кода, поэтому теперь я прошу предложения о том, как избежать определения find через все мои классы моделей вонючим способом.

2 ответа

Решение

Проблема была у меня была другая find метод, определенный в Common, так что это был тот, который привыкает и вызывает TypeError,

Это не совсем отвечает на ваш вопрос, но может быть полезно для вас.

Экземпляр сеанса SQLAlchemy имеет query_property() который возвращает свойство класса, которое производит запрос к классу. Таким образом, вы могли бы реализовать что-то похожее на ваш find() метод таким образом:

Base = declarative_base()
Base.query = db_session.query_property()

class Foo(Base):
    pass

Foo.query.get(id)
Другие вопросы по тегам