2 回答

TA贡献1851条经验 获得超3个赞
为了解决这个问题,我们可以利用Python装饰器只是返回其他函数的函数的事实。
假设您有以下装饰器:eggs
def eggs(foo=10, bar=20):
def wrapper_gen(func):
def wrapper(*args):
print(foo, bar)
func(*args)
return wrapper
return wrapper_gen
这个类:Spam
class Spam:
@eggs(foo=10, bar=20)
def baz(self, input):
print(input)
我们可以这样调用该方法:baz
Spam().baz("Hello, world!")
这给了我们
10 20
Hello, world!
现在,我们将在我们的方法中装饰,而不是直接修饰函数:__init__
class Spam:
def __init__(self, foo=10, bar=20):
self.baz = eggs(foo=foo, bar=bar)(self._baz_func)
def _baz_func(self, input):
print(input)
现在:
Spam(foo=20, bar=30).baz("Hello, world!")
此输出
20 30
Hello, world!
这有效的原因是:
@foo
def bar():
...
是以下的简写:
def bar():
...
bar = foo(bar)

TA贡献1836条经验 获得超13个赞
这不能使用常规的装饰器语法工作,原因有两个:属于类,所以它不能对不同的实例有不同的行为,因为它只有一个“副本”;并且装饰器是在类声明时执行的,而不是在创建实例时执行的,因此还没有参数。get_some_value__init__
但是,您可以通过在方法中显式应用修饰器来获得所需的结果:__init__
class Access:
def __init__(self, maxsize: int = 5, ttl: int = 10):
decorator = cached(cache=TTLCache(maxsize=maxsize, ttl=ttl))
self.get_some_value = decorator(self.get_some_value)
def get_some_value(self, input: str):
...
添加回答
举报