Python类方法调用报参数数量错误原因及self参数作用咨询
报错原因解释
你遇到的TypeError: sayHi() takes 0 positional arguments but 1 was given报错,核心逻辑如下:
对于类中定义的普通实例方法,Python会在你通过实例调用该方法时,自动把调用方法的实例对象作为第一个参数隐式传入,不需要你手动填写参数传递。
你测试的代码中如果把sayHi方法定义为不带任何参数(即def sayHi():),相当于声明该方法只能接收0个参数,但调用时Python自动传入了1个实例参数,参数数量匹配失败就会触发上述报错。你贴出的参考代码已经写了self参数,是可以正常运行的,报错场景对应你修改后去掉self的版本。
self参数的作用和必要性
- 作用1:指代当前实例,操作实例专属属性和方法
self的本质就是当前调用方法的实例对象本身,通过self你可以在类内部给实例绑定专属属性,也可以调用实例的其他方法,示例如下:
class hooman: def setName(self, name): # 给当前实例绑定name属性 self.name = name def sayHi(self): # 读取当前实例的name属性输出 print(f"hi,我是{self.name}") hooman1 = hooman() hooman1.setName("张三") hooman1.sayHi() # 输出:hi,我是张三
- 作用2:区分不同实例的属性隔离
同一个类可以实例化出多个独立的实例对象,每个实例的属性互不干扰,就是靠self来标记属性的归属:
hooman2 = hooman() hooman2.setName("李四") hooman2.sayHi() # 输出:hi,我是李四,和hooman1的name属性完全独立
- 必要性说明
Python没有设计专门的语法关键字指代当前实例,而是约定将实例方法的第一个参数作为当前实例的载体,这个参数的命名没有强制要求必须叫self,但是行业内统一约定使用self作为参数名,提升代码可读性。
如果你的方法不需要操作任何实例属性,也不想携带self参数,可以使用@staticmethod装饰器将其声明为静态方法,此时Python就不会自动传入实例参数,示例如下:
class hooman: @staticmethod def sayHi(): print("hi") hooman1 = hooman() hooman1.sayHi() # 正常输出hi,不会报错
内容的提问来源于stack exchange,提问作者PetitJuju
相关产品推荐
相关产品推荐

