【问题标题】:A decorator-creating class一个装饰器创建类
【发布时间】:2015-03-28 06:15:41
【问题描述】:

我正在编写一堆可能输出可变输出的代码,例如算术函数,我可以让输出为浮点数或整数。基本上我的问题是,如果我要为我需要的每种对象类型(可能是七个或八个)创建一个装饰器,我会因为不断重复以下内容而发疯:

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

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

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


Int = Decorator()

# Then I can use @Int

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 您是否考虑过将参数传递给def wrapper() 的选项?

标签: python class decorator


【解决方案1】:

您不能让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
>>>

【讨论】:

  • 谢谢,抱歉回复晚了。我将在我的构建中使用这个想法。
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2011-09-03
  • 2021-06-22
相关资源
最近更新 更多