不知道這是否是一個適當的問題,但這裏是問題所在。更改子類中的裝飾參數
我有一個memoized裝飾(作爲一個類實現)。裝飾器接受一個參數,它是緩存的大小。我想我的數據庫模型類各有一個搜索方法,所以我寫一個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裝飾器工作並從緩存中返回,前提是之前詢問過相同的查詢。
問題是,對於某些型號,我需要更改某些搜索的緩存大小(這是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
是否有實現這一目標的方法嗎?它甚至是一種有效的使用方式嗎?
你可以通過編寫一個不同的memoization裝飾器來實現它,它在調用時從類屬性中讀取它的緩存大小,而不是在定義時從參數中讀取它。 – BrenBarn