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

Python2中继承类未传self、无__init__时的运行问题咨询

关于Python 2中无self、无__init__类的继承问题解答

咱们来拆解一下你遇到的这个问题——首先得明确:继承机制本身是正常工作的,但你调用方法时的报错是因为Python实例方法的参数规则,和有没有定义__init__无关。

先还原你的代码和报错场景:

class Animal: 
    def whoAmi(): 
        print "Animal"

class Dog(Animal): 
    pass

d = Dog() 
print d.whoAmi  # 输出 <bound method Dog.whoAmi of <__main__.Dog instance at 0x0000000004ED3348>>
d.whoAmi()  # 抛出参数不匹配的异常

为什么会触发报错?

在Python中,当你用实例对象调用方法时,解释器会自动把这个实例作为第一个参数传递给方法——这就是为什么我们写实例方法时必须加self(这个名字只是约定,叫别的也可以)作为第一个参数。

你的Animal.whoAmi()没有定义任何参数,当你用d.whoAmi()调用时,Python会尝试把d传给这个方法,但方法接受0个参数却收到了1个,自然就抛出TypeError了。

那继承在这里起作用了吗?

当然起作用了!你看到的<bound method Dog.whoAmi of ...>已经明确说明:Dog类成功继承了Animal的whoAmi方法,只是这个方法的定义不符合实例调用的参数要求。

怎么修复这个问题?

有两种常见解决方案:

  • 改成标准实例方法:给whoAmi加上self参数,这样实例调用时Python自动传入的实例就有地方接收了:

    class Animal: 
        def whoAmi(self): 
            print "Animal"
    

    此时d.whoAmi()就能正常输出Animal了。

  • 改成静态方法:如果这个方法不需要访问实例或类的属性,只是单纯的功能函数,可以用@staticmethod装饰器标记,这样调用时就不会自动传递参数:

    class Animal: 
        @staticmethod
        def whoAmi(): 
            print "Animal"
    

    不管是用Animal.whoAmi()还是d.whoAmi()都能正常运行。

另外补充一点:有没有__init__方法不影响这个问题——__init__只是实例初始化的钩子,和方法的参数规则、继承逻辑没有直接关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:14:50