Python - метод класса в базовом классе, доступный через дочерний класс, без перехода в класс - PullRequest
0 голосов
/ 08 июля 2011

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

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.

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

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

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

0 голосов
/ 08 июля 2011

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

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

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

class Foo(Base):
    pass

Foo.query.get(id)
...