为什么Python类方法都需要传入self参数,能否省略该参数直接使用?
为什么Python类的实例方法需要传入self参数?可以省略吗?
你给出的省略self的代码实际运行会直接报错:
class Player: def __init__(name): self.name = name def print_player_name(): print(self.name)
如果尝试实例化这个类执行p = Player("小明"),首先会收到参数匹配错误:TypeError: Player.__init__() takes 1 positional argument but 2 were given;就算绕过初始化问题,调用print_player_name时也会因为找不到self变量抛出NameError。
必须传入self参数的原因
- self本质就是当前类的实例对象本身,Python设计时选择了显式传递实例的方案,和C++、Java里隐式的this指针不同,你定义实例方法时必须把第一个参数留出来接收实例,这个参数名称约定俗成叫self,你换成其他名字也能运行,但非常不建议这么做,会大幅降低代码可读性。
- 当你调用实例方法时,比如
p.print_player_name(),Python会自动把p这个实例作为第一个参数传给方法,不需要你手动传,所以定义方法时必须预留这个参数位置。
有没有办法不用写self
有两类特殊的类方法不需要传self,但都无法满足你示例中访问实例属性的需求:
- 用
@staticmethod装饰的静态方法:这类方法和普通函数没有区别,不需要访问类或者实例的属性,所以不需要传self/cls参数,自然也无法调用实例的name属性。 - 用
@classmethod装饰的类方法:这类方法第一个参数接收的是类本身,约定俗成叫cls,只能访问类级别的属性,同样无法获取实例的属性。
如果你需要在方法里访问实例的属性,就必须定义实例方法、预留self参数,正确的写法如下:
class Player: def __init__(self, name): self.name = name def print_player_name(self): print(self.name) # 调用方式 p = Player("小明") p.print_player_name() # 输出:小明
内容的提问来源于stack exchange,提问作者Othman9095
相关产品推荐
相关产品推荐

