Python中类实例属性是如何传递给装饰器内部函数的?
问题解答
这个传递逻辑本质是Python实例方法的自动传参规则 + 装饰器的方法替换逻辑共同作用的结果,分两点拆解:
1. 装饰器的替换逻辑
你写的@integer_check语法等价于在类定义完成后,执行了以下代码:
NumericalOps.multiply_together = integer_check(NumericalOps.multiply_together)
也就是说,原来类里定义的multiply_together实例方法,被替换成了integer_check返回的inner函数。
2. 实例方法的自动传参规则
Python中调用实例方法时,解释器会自动将调用该方法的实例对象作为第一个参数传入方法,我们平时写实例方法时的第一个参数self就是用来接收这个自动传入的实例的。
当你执行y.multiply_together()时,实际调用的是被替换后的inner函数,解释器还是会遵循这个规则,把实例y作为第一个参数传给inner,这个参数就被inner的第一个形参ref接收了。
所以ref本质就是你创建的NumericalOps类的实例y,自然可以直接访问_val1、_val2这些实例属性。你可以在inner函数内添加一行打印代码print(ref is y),运行后会输出True,足以证明二者是同一个对象。
另外你也能看到inner最后调用原方法时写的是return method(ref),本质就是把实例传给原方法的self参数,和普通实例方法的执行逻辑完全一致。
内容的提问来源于stack exchange,提问作者saeedhosseini
相关产品推荐
相关产品推荐

