以类名+点运算符调用方法时为何要求传入self参数?
为什么Python中用类名调用方法需要传self,实例调用却不用?
这是个非常经典的Python面向对象入门问题,我来给你拆解清楚底层逻辑~
先搞懂self到底是什么
self本质上就是当前类的实例对象本身,它的核心作用是把方法和具体的实例绑定起来,让方法能访问该实例独有的属性、调用其他实例方法。Python规定:所有实例方法的第一个参数必须是这个实例引用,行业里约定俗成把它命名为self(你改成别的名字比如this也能运行,但不推荐破坏约定)。
实例调用方法时的“自动绑定魔法”
当你创建实例d = a(),然后调用d.c()的时候,Python在背后悄悄帮你做了一件事:它自动把d这个实例作为第一个参数传递给了c方法,相当于你手动执行了a.c(d)。所以你完全不用自己写d.c(d),Python已经帮你处理了实例和方法的绑定过程。
类名直接调用方法时的“裸调用”状态
当你用a.c()直接调用类的方法时,这个方法还没有和任何具体实例绑定——Python不知道你要操作哪个实例,自然没办法自动传递self参数,这时候就会抛出TypeError,提示你缺少必要的self参数。
如果你非要用类名调用,其实也可以手动传入一个该类的实例,比如a.c(d),这时候执行效果和d.c()完全一致,因为你手动完成了实例和方法的绑定。
验证示例代码
class a: def b(self): print(f'method b called on instance: {self}') def c(self): print(f'method c called on instance: {self}') # 实例调用:自动传递self d = a() d.c() # 输出类似:method c called on instance: <__main__.a object at 0x10256d150> # 类名调用:手动传入实例作为self a.c(d) # 输出和上面完全一致 # 类名调用不传self:触发错误 a.c() # 报错:TypeError: c() missing 1 required positional argument: 'self'
内容的提问来源于stack exchange,提问作者Sanmitha Sadhishkumar
相关产品推荐
相关产品推荐

