【发布时间】:2014-02-20 06:38:18
【问题描述】:
不确定这是否是一个正确的问题,但这就是问题所在。
我有一个 memoized 装饰器(作为一个类实现)。装饰器接受一个缓存大小的参数。我希望我的 DB 模型类每个都有一个搜索方法,所以我编写了一个 mixin(我认为它是一个 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) 并且如果之前已经询问过相同的查询,那么记忆化的装饰器就会工作并从缓存中返回。
问题在于,对于某些模型,我需要更改某些搜索的缓存大小(在 SearchMixin 中默认为 100)。我可以用装饰器的不同参数重写搜索函数
class ModelB(Base):
@classmethod
@memoized(5)
def search(cls,session,**kwargs):
#Search method for my modelB
但这违背了编写 mixin 的目的(删除代码重复)。
我最想要的是
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
有什么方法可以实现吗?它甚至是一种有效的使用方式吗?
【问题讨论】:
-
你可以通过编写一个不同的 memoization 装饰器来做到这一点,它在调用时从类属性中读取其缓存大小,而不是在定义时从参数中读取它。
标签: python python-2.x python-decorators