【发布时间】:2012-11-05 02:52:07
【问题描述】:
假设我已经定义:
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 中的装饰器一般不完全了解的内容。
【问题讨论】:
标签: python decorator python-decorators