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

Python中未定义__init__方法的类会有何表现?及多类继承代码问题

Python类初始化相关问题解答

问题1:定义类时未编写__init__方法会产生什么结果?

完全不用担心,这是合法且常见的操作,Python会自动帮你处理初始化逻辑:

  • 如果你的类直接继承自object(Python3中所有类默认继承它),会使用object自带的__init__方法——这个方法不会做额外操作,仅创建一个空实例,你后续可以手动给实例添加属性。举个例子:
    class EmptyClass:
        pass
    
    obj = EmptyClass()
    obj.username = "eastsun"
    print(obj.username)  # 输出 eastsun
    
  • 如果你的类有父类,Python会按照*MRO(方法解析顺序)*自动继承父类的__init__方法。若父类的__init__需要参数,创建子类实例时必须传入对应参数,否则会触发TypeError。

问题2:多继承类的初始化行为分析

先把你未写完的D类补全为与C逻辑一致的完整代码,方便分析:

class A(object):
    pass

class B(object):
    def __init__(self, value):
        print('B(value=%s)' % value)

class C(A):
    def __init__(self, value):
        print('C(value=%s)' % value)
        super(C, self).__init__(value)

class D(A, B):
    def __init__(self, value):
        print('D(value=%s)' % value)
        super(D, self).__init__(value)

类C的执行结果

当你调用c = C(10)时:

  1. 先执行C的__init__,打印C(value=10);
  2. 接着super(C, self).__init__(value)会按MRO找下一个类的__init__——C的父类A没有自定义__init__,因此会调用object的__init__,但object.__init__仅接受self一个参数,无法处理传入的value,所以会抛出TypeError: object.__init__() takes no arguments错误。

类D的执行结果

D是多继承A和B,通过print(D.__mro__)可查看它的方法解析顺序为(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)。当调用d = D(20)时:

  1. 先执行D的__init__,打印D(value=20);
  2. super(D, self).__init__(value)按MRO顺序查找,跳过无自定义__init__的A,找到B的__init__,而B的__init__刚好接受value参数,因此会打印B(value=20),整个过程无报错。

另外你提到的Python2.7兼容性完全没问题,只要导入from __future__ import print_function,且所有类显式继承object(你已经做到),代码行为会和Python3.6.5一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:06:31