为什么Python类实例方法需要通过实例调用才能自动传入self参数?
Python实例方法的self参数绑定规则
- 类中定义的未加任何装饰器、第一个参数为
self的方法属于实例方法,仅当通过类的实例对象调用时,Python会自动将该实例作为self参数传入方法;如果直接通过类本身调用实例方法,Python不会做自动传参处理,需要手动传入类的实例作为第一个参数。
各场景问题解释
- 正常运行场景
oneTwo = MyClass(1, 2) oneTwo.isVar1(1)
通过实例oneTwo调用isVar1,Python自动将oneTwo作为self传入,方法实际接收参数为self=oneTwo、var=1,符合参数要求,运行正常。
- 缺少参数报错场景
MyClass(1, 2) MyClass.isVar1(1)
MyClass(1, 2)虽然生成了类实例,但没有赋值给变量留存;后续直接通过类调用isVar1属于非实例调用,不会自动传self,你仅传入了1个参数,而方法需要self、var两个位置参数,因此触发参数缺失报错。
- None属性不存在报错场景
MyClass.isVar1(None, 1)
你手动传入None作为self参数,方法运行时需要访问self.var1,但None属于空对象,没有var1属性,因此触发属性不存在报错。
- 非常规可运行场景
MyClass.__init__(MyClass, 1, 2) MyClass.isVar1(MyClass, 1)
此处你手动将MyClass类对象本身作为self参数传入,还调用__init__给MyClass类对象绑定了var1属性,语法层面没有错误因此可以运行,但这完全不符合实例方法的设计逻辑:实例方法的self本应指向类的实例对象,将类对象传入属于错误用法,不推荐使用。
补充说明
如果需要定义可以直接通过类调用的方法,可以使用装饰器标识:
- 加
@classmethod装饰器的方法为类方法,第一个参数约定为cls,调用时会自动传入类本身作为第一个参数 - 加
@staticmethod装饰器的方法为静态方法,没有默认传入的第一个参数,调用规则和普通函数一致
内容的提问来源于stack exchange,提问作者Anonyma
相关产品推荐
相关产品推荐

