装饰器创建 class
A decorator-creating class
我正在编写一堆可能输出可变的代码,比如算术函数,我可以让输出为浮点数或整数。基本上我的问题是,如果我要为我需要的每个对象类型(可能是七个或八个)创建一个装饰器,我会因为不断重复而发疯:
def Int(fn):
def wrapper():
return int(fn())
return wrapper
我想要的是像下面这样的 class,它会根据实例化时使用的名称创建装饰器,它将是上面函数的副本,但会进行适当的类型修改。
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
>>>
我正在编写一堆可能输出可变的代码,比如算术函数,我可以让输出为浮点数或整数。基本上我的问题是,如果我要为我需要的每个对象类型(可能是七个或八个)创建一个装饰器,我会因为不断重复而发疯:
def Int(fn):
def wrapper():
return int(fn())
return wrapper
我想要的是像下面这样的 class,它会根据实例化时使用的名称创建装饰器,它将是上面函数的副本,但会进行适当的类型修改。
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
>>>