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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:06:01