python - 装饰器创建类

标签 python class decorator

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

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

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

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


Int = Decorator()

# Then I can use @Int

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

最佳答案

您无法让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
>>>

关于python - 装饰器创建类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28207634/

相关文章:

class - 我的 Parser 类的类型有什么问题?

javascript - 检查具有给定类的元素,未找到情况,将类添加到第一个元素

python - 实现装饰器,它将用另一个实现替换一个类

c++ - 通过指针获取: good practice?装饰一个char*和char const*

python - 使用 z3 证明 bool /算术公式的恒等性

javascript - ES5/6 类中多个相同的 getter/setter 函数的好的解决方案?

python - 返回 f 字符串的 For 循环函数

c# - DependencyResolutionException 检测到循环组件依赖性 : How to use Autofac to inject decorator?

python - 如何创建 WTForms 字段子类?

python - 如何使用数据帧将这些嵌套的 for 循环压缩为 python 中的列表理解?