[英]How do I use the python-decorator package to decorate classmethods?
[英]python-Decorator function inside Class
我有以下代碼,如果我將自己從方法中刪除,則可以正常工作
class tests:
def __init__(self):
pass
def func(self,a):
def wrapp(x):
y=x+2
return a(y)
return wrapp
@func
def func1(self,b):
return b
print (tests.func1(10))
我相信裝飾器函數是返回另一個函數的函數。 那在課堂上行不通嗎? 忽略縮進錯誤,因為在將代碼粘貼到此處時無法實現。請幫助我如何在課堂中實現此方案。
您可以在類之外聲明裝飾器。 同樣,當裝飾一個類方法時,似乎需要將自變量從包裝器傳遞給裝飾的函數(為了更清晰起見,更改了名稱):
def add_two(fn):
def wrapper(self, x):
y = x + 2
return fn(self, y)
return wrapper
class Test:
@add_two
def func1(self, b):
return b
f = Test()
f.func1(5) # returns 7
這里的問題根本不是裝飾器。 此問題是您將func1和裝飾器用作靜態方法,而沒有刪除self參數。 如果刪除自變量,則可以正常工作。
沒有staticmethod裝飾器
class Test:
def add_two(func=None):
def wrapper_add_two(*args, **kwargs):
return func(*args, **kwargs) + 2
return wrapper_add_two
@add_two
def func1(b):
return b
print(Test.func1(10)) #12
帶有staticmethod裝飾器
不幸的是,以這種方式使用它們將它們存儲為未綁定的靜態方法,並且您需要綁定它們才能使其正常工作。
class Test:
@staticmethod
def add_two(func):
def wrapper_add_two(*args, **kwargs):
return func.__func__(*args, **kwargs) + 2
return wrapper_add_two
@add_two.__func__
@staticmethod
def func1(b):
return b
print(Test.func1(10)) #12
使用staticmethod裝飾器運行並且沒有函數綁定可以為您提供
TypeError:“靜態方法”對象不可調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.