Не уверен, что это даже правильный вопрос, но вот проблема.Изменение аргументов декоратора в подклассах
У меня есть памятный декоратор (выполненный как класс). Декоратор принимает аргумент, размер кеша. Я хочу, чтобы мои DB классы модели для каждого есть метод поиска, поэтому я написать подмешать (я думаю, что это Mixin)
class SearchMixin(object):
@classmethod
@memoized(100)
def search(cls,session,**kwargs):
q = session.query(cls)
for k,v in kwargs.items():
q = q.filter(getattr(cls,k,None).__eq__(v))
res = q.one()
return res
И в моих моделях,
class ModelA(Base,SearchMixin):
foo = Column()
bar = Column()
#And so on
Теперь я могу сделать ModelA.search(foo=x,bar=y)
и memoized decorator работает и возвращается из кеша, если тот же запрос был задан раньше.
Проблема в том, что для некоторых моделей мне нужно изменить размер кеша для некоторых поисков (то есть defualt 100
в SearchMixin
). Я могу переписать функцию поиска с другим аргументом для декоратора
class ModelB(Base):
@classmethod
@memoized(5)
def search(cls,session,**kwargs):
#Search method for my modelB
но побеждает цель написания подмешать (удаление дублирования кода).
Что я хочу идеально
class ModelB(Base,SearchMxin):
foo1 = Column()
bar1 = Column()
cache_size = 5
#Some magic
#Now I don't need to rewrite the search function with a different argument
Есть ли способ достижения этой цели? Это даже действительный способ использования?
Вы можете сделать это, написав другой декоратор воспоминаний, который считывает свой размер кеша из атрибута класса при его вызове, вместо этого читая его из аргумента, когда он определен. – BrenBarn