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裝飾器來裝飾功能的一部分
- 7. Python - 函數是否可以看到它自己的裝飾器
- 8. Python 2.5中的類裝飾器?
- 9. 是否有可能使用Model.values()模型的@property裝飾器?
- 10. 使用反射來識別給定的裝飾器的屬性
- 11. 是否有像c#的python裝飾器?
- 12. 是否可以在Python中裝飾類?
- 13. 在Python中,通用函數/對象加倍裝飾器是否可行?
- 14. C#反射:是否有可能查看使用反射獲得的構造函數的代碼?
- 15. Python:使用相同的裝飾器來裝飾__call__和普通函數?
- 16. Python - 使用類中的裝飾函數
- 17. Python的裝飾我的功能檢查
- 18. Python-我可以在函數內使用裝飾器嗎?
- 19. 是否有可能在Python中使用太多的函數?
- 20. 是否有可能直接在XAML中使用反射
- 21. 是否可能使用反射getMethods?
- 22. Python:裝飾器可以確定一個函數是否正在類中定義?
- 23. 是否有可能使用Python元類來反轉繼承?
- 24. python中的函數裝飾器安全
- 25. 檢測super()是否具有裝飾器的功能?
- 26. Python裝飾器計數函數調用
- 27. 是否有可能使用WPF中的反射來綁定到屬性?
- 28. 是否有Python函數檢查發生器是否啓動?
- 29. 使用裝飾器將函數變成Python中的生成器
- 30. 是否有可能在python
請注意,Python 3.2的'functools.wraps'使用'__wrapped__'來指向原始函數。我建議使用相同的名稱,因此代碼可以停止在此上發散。 (我也需要開始這樣做;我一直使用「func」這個名字。)我推薦實際使用'functools.wraps',但這並不是一個解決方案,直到3.2被廣泛使用。 – 2010-10-14 01:38:32