У меня была интересная проблема сегодня утром. У меня был базовый класс, который выглядит следующим образом:Украшение метода, который уже является classmethod?
# base.py
class Base(object):
@classmethod
def exists(cls, **kwargs):
# do some work
pass
и модуль декоратора, который выглядел так:
# caching.py
# actual caching decorator
def cached(ttl):
# complicated
def cached_model(ttl=300):
def closure(model_class):
# ...
# eventually:
exists_decorator = cached(ttl=ttl)
model_class.exists = exists_decorator(model_class.exists))
return model_class
return closure
Вот мой подкласс модель:
@cached_model(ttl=300)
class Model(Base):
pass
Дело в том, когда я на самом деле вызовите Model.exists, я получаю жалобы на неправильное количество аргументов! Проверка аргументов в декораторе показывает, что ничего странного не происходит - аргументы - именно то, что я ожидаю, и они совпадают с сигнатурой метода. Как добавить дополнительные декораторы к методу, который уже украшен classmethod
?
Не все модели кэшированы, но метод exists() присутствует на каждой модели как метод класса, поэтому переопределение декораторов не является вариантом: cached_model
может добавлять classmethod to exists(), но тогда что делает Существует() метод класса на нераскрытых моделях?
Итак, какое решение? Не ясно. Было бы намного лучше, если бы вы оставили свой вопрос так, как есть, и отправили ответ. – Marcin
Вы * можете * ... вопрос и ответ имейте это в виду, но будьте внимательны и ответьте отдельно. См. Http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking – delnan
Я думаю, вы забыли '@ classmethod' в классе' Base'. –