2
A
回答
3
这通常是不可能的未经装饰的合作。例如,
def my_decorator(f):
def wrapper(*args, **kwargs):
return f(*args, **kwargs)
wrapper.decorators = [wrapper]
if hasattr(f, 'decorators'):
wrapper.decorators.extend[f.decorators]
return wrapper
本质上,所有的装饰作用是包裹功能照常,然后把一个上装饰包装函数属性。然后它检查包装的函数是否有类似的列表并向上传播。
这是相当无用虽然
我想你想是
def my_decorator(f):
def wrapper(args):
return f(args)
wrapper.decorated = f
return wrapper
这将允许你做的东西像
@my_other_decorator # another decorator following the same pattern
@my_decorator
def foo(args):
print args
foo.decorated(args) # calls the function with the inner decorated function (my_decorator)
foo.decorated.decorated(args) # original function
你其实可以抽象这种模式成装饰者
def reversable(decorator):
def wrapper(func):
ret = decorator(func) # manually apply the decorator
ret.decorated = funC# save the original function
return ret
return wrapper
现在,当你写你的装饰:
@reversable
def my_decorator(f):
def wrapper(x):
return f(x + 1)
return wrapper
1
的@MyDecorator
语法只是写了下面的Python代码的缩写:
def f():
pass
f = MyDecorator(f)
写在这种形式下,你可以看到装饰应用于该功能的信息不会以任何方式跟踪。你可能让你的装饰者在应用时记得(Aaron's answer有一些关于如何做到这一点的好主意),但是你必须用自己的方式包装所有第三方装饰者。
相关问题
- 1. Python装饰器,检查函数是否被调用之前
- 2. 检查一个Python函数是否用特定的修饰器装饰
- 3. 是否有可能拥有带参数的Python类装饰器?
- 4. 是否有可能在Python(2.4)中制作这种装饰器?
- 5. 检查一个函数是否有装饰器
- 6. Python 2.5中的类装饰器?
- 7. 是否有可能使用Model.values()模型的@property装饰器?
- 8. 使用反射来识别给定的装饰器的属性
- 9. 是否可以在Python中装饰类?
- 10. C#反射:是否有可能查看使用反射获得的构造函数的代码?
- 11. Python:使用相同的装饰器来装饰__call__和普通函数?
- 12. Python的装饰我的功能检查
- 13. Python:装饰器可以确定一个函数是否正在类中定义?
- 14. 是否有可能使用Python元类来反转继承?
- 15. Python装饰器计数函数调用
- 16. 检测super()是否具有装饰器的功能?
- 17. 是否有可能使用WPF中的反射来绑定到属性?
- 18. 是否有可能在python
- 19. python:是可能的方法参数的装饰器?
- 20. Python装饰器处理装饰函数的默认参数
- 21. c函数装饰器#
- 22. 将装饰器应用于python包中的所有函数
- 23. 在python中有一种方法可以在调用它之前检查函数是否是“生成器函数”?
- 24. 在Python中装饰装饰器
- 25. 是否有可能在Sitemesh中多次装饰?
- 26. 是否可以在Typescript中修饰装饰器?
- 27. 是否可以使用装饰器在Python中进行“扩展”时间监控?
- 28. 从不同的模块中使用python装饰器函数
- 29. 有没有可能在ABAP中违反反射封装?
- 30. 是在有任何wxWidgets的函数来检查PDF软件是否可用
请注意,Python 3.2的'functools.wraps'使用'__wrapped__'来指向原始函数。我建议使用相同的名称,因此代码可以停止在此上发散。 (我也需要开始这样做;我一直使用“func”这个名字。)我推荐实际使用'functools.wraps',但这并不是一个解决方案,直到3.2被广泛使用。 – 2010-10-14 01:38:32