为何Python中类与实例绑定同一无参函数后调用均无报错?
问题解答
你的困惑核心在于没搞懂Python中函数绑定为方法的触发条件,咱们一步步拆解:
1. 给类赋值函数的情况
当你执行MyClass.foo = myfunction时,MyClass.foo只是把普通函数挂载到了类对象上。通过类直接调用这个函数时,Python不会自动传入任何参数——这和你直接调用myfunction()完全一样,所以MyClass.foo()能正常打印'hi'。
只有当你通过实例访问类上的这个函数时(比如没给obj赋值foo的情况下调用obj.foo()),Python才会把这个函数包装成绑定方法,自动把实例作为第一个参数传入。但你这里给obj单独赋值了foo,走的是另一个逻辑。
2. 给实例赋值函数的情况
当你执行obj.foo = myfunction时,这个函数是直接存在实例的专属属性字典(obj.__dict__)里的,和类上的foo没有继承关系。此时调用obj.foo(),Python不会把obj作为参数自动传入——因为这个函数不是类定义的方法,只是你塞给实例的一个普通函数对象,所以调用时不需要额外参数,自然也不会报错。
反例验证
如果把myfunction改成需要参数的版本:
def myfunction(self): print('hi') MyClass.foo = myfunction obj = MyClass() obj.foo = myfunction MyClass.foo() # 报错:缺少self参数 obj.foo() # 同样报错:缺少self参数
这就能看出来,不管是类还是实例上直接赋值的普通函数,调用时都不会自动传参,和你一开始的无参函数能正常运行的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Varun M
相关产品推荐
相关产品推荐

