假设我已经定义:
def to_class(cls):
""" returns a decorator
aimed to force the result to be of class cls. """
def decorating_func(func):
def wrapper(*args, **kwargs):
return cls(func(*args, **kwargs))
return wrapper
return decorator(decorating_func)
我希望用它来创建装饰器,将函数结果转换为给定类的对象。但是,这不起作用:
class TestClass(object):
def __init__(self, value):
self._value = (value, value)
def __str__(self):
return str(self._value)
@staticmethod
@to_test_class
def test_func(value):
return value
to_test_class = to_class(TestClass)
因为 test_func 将寻找 to_test_class 并且不会找到它。另一方面,在类定义之前将赋值给 to_test_class 也会失败,因为尚未定义 TestClass。
尝试将 @to_class(TestClass) 放在 test_func 的定义之上也会失败,因为该方法是在类之前构造的(如果我没记错的话)。
我发现的唯一解决方法是将 to_test_class 手动定义为装饰器,而不是从一般的“to_class”定义返回。
值得一提的是,这只是一个基本示例,但我希望将 to_class 用于许多应用程序,例如在将返回值“插入”到类的构造函数之前对其进行修改;我也希望将它用作其他类方法的装饰器。
我相信有些人认为“to_class”装饰器毫无意义;相反,可以在装饰方法中进行操作。不过,我觉得它很方便,并且有助于提高可读性。
最后,我想补充一点,20% 是出于实际原因,80% 是出于学习原因,因为我发现这是我对 Python 中的装饰器一般不完全理解的东西。