Python类方法调用中的self参数:两种调用方式为何要求不同?
Python中类方法调用的self参数差异解析
在Python里,类中定义的无装饰器方法默认是实例方法,这两种调用方式的差异,核心在于Python对实例方法的调用机制不同:
通过类名直接调用方法
这种方式相当于把类里的方法当作普通独立函数来使用,Python不会自动传递任何额外参数。所以如果方法定义里没有self,你传几个参数就用几个;如果方法定义里有self,你还得手动给self传一个值(比如实例对象或者其他任意值),否则会报错。这种调用方式其实违背了实例方法的设计初衷,一般不推荐使用。通过类实例调用方法
当你用实例调用方法时,Python会在后台自动把这个实例对象作为第一个参数传递给方法。所以方法定义里必须有一个参数(通常命名为self,名字可以自定义,但行业约定用self)来接收这个实例。比如你写lc.cleanupList(li2),Python实际执行的是listManipulator.cleanupList(lc, li2)——lc这个实例被自动传给了方法的第一个参数,也就是self。
举个直观的代码例子:
class listManipulator: # 带self的实例方法,供实例调用 def cleanupList(self, lst): return [item for item in lst if item is not None] # 实例调用场景 lc = listManipulator() li2 = [1, None, 3, None] print(lc.cleanupList(li2)) # 自动传入lc作为self,输出 [1, 3] # 类名直接调用场景(不推荐) li = [2, None, 4] # 如果方法定义里没有self,直接传li即可 # 若方法定义里有self,必须手动传第一个参数,比如: # print(listManipulator.cleanupList(lc, li)) # 同样输出 [2,4]
简单来说:实例调用时Python帮你自动传实例给self,类直接调用时没人帮你传,所以要不要self完全看你有没有手动传对应参数。
内容的提问来源于stack exchange,提问作者Morten Paaske
相关产品推荐
相关产品推荐

