今朝は面白い問題がありました。すでにクラスメソッドであるメソッドをデコレートしますか?
# 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をexistキャッシュされていないモデルのクラスメソッドはexists()ですか?
だから、解決策は何ですか?それははっきりしていません。あなたが質問をそのまま放置して答えを投稿した方がずっと良かったでしょう。 – Marcin
質問を投稿して自分で回答することはできますが、質問と回答は別々にしてください。 http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking – delnan
を参照してください。 'Base'クラスの' @classmethod'です。 –