【发布时间】:2012-01-23 19:22:25
【问题描述】:
今天早上我遇到了一个有趣的问题。我有一个看起来像这样的基类:
# 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 可以将类方法添加到 exists(),但是接下来呢使exists() 成为未缓存模型上的类方法?
【问题讨论】:
-
那么,解决方案是什么?目前还不清楚。如果您将问题保持原样并发布答案会更好。
-
您可以发布问题并自己回答,但请将问题和回答分开。见meta.stackexchange.com/questions/17463/…
-
我想你在课堂上忘记了
@classmethodBase。 -
@RikPoggi,提出了明确的问题,修复了缺少的装饰器 - 谢谢