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)