【发布时间】:2021-12-26 13:02:55
【问题描述】:
我目前正在研究一个 Python 类,用作类方法的装饰器。 在这种情况下,我遇到了一个我很难理解的问题。 举个例子:
from functools import partial
class Decorator:
def __init__(self, func = None, *args):
self.uses_init = func is None
self.func = func
self.instance = None
self.args = args
def __call__(self, *args, **kwargs):
self.func = args[0]
def wrapper(cls, *args, **kwargs):
print('before')
parsed_func = self.func(cls, *args, **kwargs)
print('after')
return parsed_func
return wrapper
def call(self, cls, *args, **kwargs):
print('before')
parsed_func = self.func(cls, *args, **kwargs)
print('after')
return parsed_func
def __get__(self, instance, owner):
# This is only used when uses_init == False
return partial(self.call, instance)
可以不带参数使用@Decorator或带参数@Decorator(*args)
使用此代码按预期工作:
class HelloWorld:
@Decorator()
def print(self, name):
print(name)
hello_world = HelloWorld()
hello_world.print("Max Musterman")
print('----------------------')
class HelloWorld:
@Decorator
def print(self, name):
print(name)
hello_world = HelloWorld()
hello_world.print("Max Musterman")
我想使用self.call 方法代替wrapper 以避免重复代码。当我尝试这个时:
class Decorator:
def __init__(self, func = None, *args):
self.uses_init = func is None
self.func = func
self.instance = None
self.args = args
def __call__(self, *args, **kwargs):
self.func = args[0]
return self.call
def call(self, cls, *args, **kwargs):
print('before')
parsed_func = self.func(cls, *args, **kwargs)
print('after')
return parsed_func
def __get__(self, instance, owner):
# This is only used when uses_init == False
return partial(self.call, instance)
尽管检查了inspect.signature(Decorator().call) 和inspect.signature(Decorator()(lambda: None)) 方法的签名,但我遇到了TypeError: print() missing 1 required positional argument: 'name' 给出了相同的结果。
【问题讨论】:
标签: python python-3.x decorator python-decorators