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)时:
- 先执行
C的__init__,打印C(value=10); - 接着
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)时:
- 先执行
D的__init__,打印D(value=20); 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
相关产品推荐
相关产品推荐

