我有一個由別人編寫的相當複雜的裝飾器。我想要做的是根據一個決定調用一次函數的裝飾版本,或者再次調用原始函數(未裝飾)。這可能嗎?調用之前的Python裝飾函數
9
A
回答
26
隨着:
decorator(original_function)()
無:
original_function()
裝飾器僅僅是一個函數,它接受一個函數作爲參數並返回另一個。 @語法完全是可選的。也許篩選一些documentation可能有助於澄清事情。
2
def original_function():
pass
decorated_function= decorator(original_function)
if use_decorated:
decorated_function()
else:
original_function()
只裝飾一次,然後選擇要調用的版本。
1
這裏是我提出的問題的食譜。我還需要保持簽名相同,所以我使用了裝飾模塊,但是您可以重新夾緊以避免這種情況。基本上,訣竅是給函數添加一個屬性。 '原始'函數沒有綁定,所以你需要傳入一個'self'作爲第一個參數,所以我添加了一些額外的代碼來檢查。
# http://www.phyast.pitt.edu/~micheles/python/decorator-2.0.1.zip
from decorator import decorator, update_wrapper
class mustbe : pass
def wrapper (interface_) :
print "inside hhh"
def call (func, self, *args, **kwargs) :
print "decorated"
print "calling %s.%s with args %s, %s" % (self, func.__name__, args, kwargs)
return interface_ (self, *args, **kwargs)
def original (instance , *args, **kwargs) :
if not isinstance (instance, mustbe) :
raise TypeError, "Only use this decorator on children of mustbe"
return interface_ (instance, *args, **kwargs)
call = decorator (call, interface_)
call.original = update_wrapper (original, call)
return call
class CCC (mustbe):
var = "class var"
@wrapper
def foo (self, param) :
"""foo"""
print self.var, param
class SSS (CCC) :
@wrapper (hidden_=True)
def bar (self, a, b, c) :
print a, b, c
if __name__ == "__main__" :
from inspect import getargspec
print ">>> i=CCC()"
i=CCC()
print ">>> i.var = 'parrot'"
i.var = 'parrot'
print ">>> i.foo.__doc__"
print i.foo.__doc__
print ">>> getargspec(i.foo)"
print getargspec(i.foo)
print ">>> i.foo(99)"
i.foo(99)
print ">>> i.foo.original.__doc__"
print i.foo.original.__doc__
print ">>> getargspec(i.foo.original)"
print getargspec(i.foo.original)
print ">>> i.foo.original(i,42)"
i.foo.original(i,42)
print ">>> j=SSS()"
j=SSS()
print ">>> j.bar(1,2,3)"
j.bar(1,2,3)
相關問題
- 1. Python裝飾器在它裝飾的函數被調用之前運行?
- 2. Python裝飾器,檢查函數是否被調用之前
- 3. Python裝飾器計數函數調用
- 4. Python - 使用類中的裝飾函數
- 5. 調用裝飾的外部函數
- 6. Python裝飾器處理裝飾函數的默認參數
- 7. 與函數參數的Python裝飾
- 8. 函數裝飾器未被調用
- 9. 修飾器不調用封裝函數
- 10. Python裝飾3.0和裝飾的參數
- 11. python裝飾器和包裝函數調試
- 12. 函數和它的裝飾器之間的Python-共享變量
- 13. 裝飾Python的內建print()函數
- 14. python中的函數裝飾器安全
- 15. 是Python中的裝飾器,就像調用函數上的函數一樣?
- 16. Python函數修飾器調用
- 17. Python裝飾器內部調用錯誤函數
- 18. Python裝飾器vs傳遞函數
- 19. 如何測試Python函數裝飾器?
- 20. Python裝飾器函數執行
- 21. python裝飾器,嵌套函數
- 22. 在Python中裝飾遞歸函數
- 23. python調用序列中的裝飾器
- 24. Python:使用相同的裝飾器來裝飾__call__和普通函數?
- 25. 在python中定義函數之前調用函數
- 26. 帶參數的Python類裝飾器,但沒有運行裝飾函數
- 27. Python的 - 裝飾
- 28. 訪問在裝飾器之外的裝飾器中創建的函數屬性
- 29. python裝飾器,調用延遲功能
- 30. python unittest:不能調用裝飾測試
鏈接損壞:( – 2015-09-19 14:48:01