一个装饰器创建类

时间:2015-01-29 05:35:02

标签: python class decorator

我正在编写一堆可能具有可变输出的代码,比如算术函数,我可以将输出设置为float或int。基本上我的问题是,如果我要为我需要的每个对象类型创建一个装饰器(可能是七个或八个),我会不断重复:

def Int(fn):
    def wrapper():
        return int(fn())
    return wrapper

我想要的是一个像下面这样的类,它会根据它实例化的名称创建一个装饰器,它将是上面函数的副本,但具有适当的类型修改。

class Decorator(object):
    def __init__(self):
        ...
    ...


Int = Decorator()

# Then I can use @Int

任何帮助都会非常感激。感谢。

1 个答案:

答案 0 :(得分:4)

您不能让Decorator知道将分配给它的名称。 实例化后,发生,因此在分配名称时已经创建了对象。

然而,您可以制作一个动态创建装饰器的装饰器:

from functools import wraps
def set_return_type(typeobj):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return typeobj(func(*args, **kwargs))
        return wrapper
    return decorator

然后,您可以通过为所需类型提供类型对象参数来使用此装饰器:

@set_return_type(int)   # Causes decorated function to return ints
@set_return_type(float) # Causes decorated function to return floats

以下是演示:

>>> from functools import wraps
>>> def set_return_type(typeobj):
...     def decorator(func):
...         @wraps(func)
...         def wrapper(*args, **kwargs):
...             return typeobj(func(*args, **kwargs))
...         return wrapper
...     return decorator
...
>>> @set_return_type(float)
... def test():
...     return 1
...
>>> test()
1.0
>>>