You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:16