1 回答
TA贡献1735条经验 获得超5个赞
装饰器应用于函数对象,而不应用于绑定方法。这意味着您需要手动传递self参数:
def boundtest(func):
def onDecorator(self, x, y, *args, **kwargs):
print(x, y, *args, **kwargs)
assert x in range(self.width) and y in range(self.height)
return func(self, x, y, *args, **kwargs)
return onDecorator
Python使用一个称为绑定的过程将一个函数转换为一个绑定方法,调用绑定方法会自动将绑定的内容作为第一个参数传递给它。self当您在实例上调用函数时,这就是如何传递给方法的。有关详细信息,请参见描述符HowTo。除了手动传递外self,您还可以通过调用生成绑定方法来手动调用描述符绑定func.__get__():
def boundtest(func):
def onDecorator(self, x, y, *args, **kwargs):
print(x, y, *args, **kwargs)
assert x in range(self.width) and y in range(self.height)
bound_method = func.__get__(self, type(self))
return bound_method(x, y, *args, **kwargs)
return onDecorator
该绑定行为应用于onDecorator解析器game.set在解析时返回的功能对象,而不应用于包装的func对象。
添加回答
举报