我想提供一个装饰器,允许在应用于函数时进行可选配置。
一个简单的实现如下:
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 视图提供用户友好的装饰器。
这种方法没有错误,但是允许一个类有一个静态工厂方法来实例化它自己的自定义实例,作为装饰器有什么不好的吗?