我有以下代码,如果我将自己从方法中删除,它会正常工作
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))
我相信装饰器函数是返回另一个函数的函数。那在课堂上行不通吗?忽略缩进错误,因为在此处粘贴代码时无法实现。 请帮助我如何在课堂上实现这种情况。
答案 0 :(得分:2)
您可以在类之外声明装饰器。另外,在装饰类方法时,似乎需要将自变量从包装器传递到装饰的函数(为了更清楚起见,更改了名称):
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
答案 1 :(得分:1)
这里的问题根本不是装饰器。此问题是您将func1和装饰器用作静态方法,而没有删除self参数。如果删除自变量,则可以正常工作。
没有静态方法装饰器
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
使用静态方法装饰器
不幸的是,以这种方式使用它们将它们存储为未绑定的静态方法,因此您需要bind them才能正常工作。
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:“静态方法”对象不可调用