関数に適用するときにオプションの構成を可能にするデコレータを提供したいと思います。
簡単な実装は次のとおりです。
import functools
class Deco(object):
config = {'message': 'hello'}
def __init__(self, func):
self.func = func
functools.wraps(func)(self)
def __call__(self, *args, **kwargs):
print self.config['message']
return self.func(*args, **kwargs)
@classmethod
def customize(cls, **kwargs):
"""Return a customized instance of this class. """
return type(cls.__name__, (Deco, ), {'config': kwargs})
@Deco
def add(a, b):
return a + b
@Deco.customize(message='bye')
def sub(a, b):
return a - b
>>> add(1, 2)
'hello'
>>> sub(2, 1)
'bye'
これを使用して、Django ビューに使いやすいデコレータを提供したいと考えています。
このアプローチはエラーなしで機能しますが、クラスがそれ自体のカスタマイズされたインスタンスをインスタンス化する静的ファクトリ メソッドをデコレータとして持つことを許可することに何か問題がありますか?