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

Python多继承中调用父类实例方法为何需传入self参数?

为什么调用Python父类方法时传入self能解决缺少参数的错误?

先看你遇到的具体场景:

可正常运行的代码

class Base_1:
    def base_1(self):
        print("Base Class 1")

class Base_2:
    def base_2(self):
        print("Base Class 2")

class Derive(Base_1,Base_2):
    def call(self):
        print("I am derive from {0} {1}".format(Base_1.base_1(self),Base_2.base_2(self)))

obj=Derive()
obj.call()

报错的代码

class Base_1:
    def base_1(self):
        print("Base Class 1")

class Base_2:
    def base_2(self):
        print("Base Class 2")

class Derive(Base_1,Base_2):
    def call(self):
        print("I am derive from {0} {1}".format(Base_1.base_1(),Base_2.base_2()))

obj=Derive()
obj.call()

报错信息

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[9], line 12
      9         print("I am derive from {0} {1}".format(Base_1.base_1(),Base_2.base_2()))
     11 obj=Derive()
---> 12 obj.call()

Cell In[9], line 9, in Derive.call(self)
      8 def call(self):
----> 9     print("I am derive from {0} {1}".format(Base_1.base_1(),Base_2.base_2()))

TypeError: Base_1.base_1() missing 1 required positional argument: 'self'

核心原因和Python实例方法的绑定规则直接相关:

  • 实例方法必须绑定实例才能执行:你在Base_1和Base_2里定义的base_1、base_2都是实例方法,这类方法的第一个参数self是Python用来接收调用该方法的实例对象的。
  • 两种调用方式的本质区别:
    • 当你用obj.base_1()这种「实例调用」的方式时,Python会自动把obj作为self参数传入,不需要手动编写。
    • 但如果你直接用Base_1.base_1()调用,这是直接调用类的「未绑定方法」——此时Python不会自动传入任何实例,所以必须手动把当前的实例(也就是Derive类call方法里的self)传进去,否则方法就会因为缺少必填的self参数报错。
  • 多继承场景下的self含义:Derive类的call方法中的self是Derive的实例对象,这个实例同时继承了两个父类的方法。把它传给Base_1.base_1(self),相当于让父类的方法绑定到这个实例上,方法内部的self就指向这个实例,自然就能正常执行了。

另外补充一种更规范的父类方法调用方式(适合遵循MRO顺序的场景):

class Derive(Base_1,Base_2):
    def call(self):
        super().base_1()
        super().base_2()
        print("I am derive from Base_1 and Base_2")

内容的提问来源于stack exchange,提问作者aniketpant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:00:25