python 继承中的__init__

本文探讨了在面向对象编程中,子类如何通过重写__init__方法来扩展或覆盖父类的初始化行为。当子类不重写__init__时,将自动调用父类的初始化方法;若子类重写了__init__,则需显式调用父类的初始化方法以确保完整继承。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果子类不重写__init__, 实例化子类时,会自动调用父类定义的__init__

如果子类要重写__init__,实例化子类,就不会调用父类已经定义的__init__

所以如果想要扩充父类,需要显示调用父类的__init__

转载于:https://www.cnblogs.com/sunhuahuaa/p/9723733.html

Python中,继承父类的`__init__()`方法有两种常用的方式。第一种方式是使用`super().__init__()`来继承父类的`__init__()`方法,同时也可以使用`super()`继承其他方法。这种方式适用于单继承和多继承的情况。 第二种方式是使用`父类.父类方法(self, 参数)`的方式来继承父类的`__init__()`方法。这种方式在多继承的情况下会有明显的差异[2]。在多继承的情况下,使用`super(子类, self).__init__()`会按照方法解析顺序(MRO)调用父类的方法,而使用`父类.父类方法(self, 参数)`会按照定义顺序依次调用父类的方法。 举个例子来说明。假设有以下类的继承关系: ```python class A: def __init__(self): print("[开始 访问A") print("[结束 访问A") class B(A): def __init__(self): print("[开始 访问B") A.__init__(self) print("[结束 访问B") class C(A): def __init__(self): print("[开始 访问C") A.__init__(self) print("[结束 访问C") class D(A): def __init__(self): print("[开始 访问D") A.__init__(self) print("[结束 访问D") class E(B, C, D): def __init__(self): print("[开始 访问E") B.__init__(self) C.__init__(self) D.__init__(self) print("[结束 访问E") # 实例化类E e = E() ``` 使用第一种方式`super(子类, self).__init__()`,输出结果为: ``` 访问E 访问B 访问C 访问D 访问A 访问A 访问D 访问C 访问B 访问E ``` 而使用第二种方式`父类.父类方法(self, 参数)`,输出结果为: ``` 访问E 访问B 访问C 访问D 访问A 访问A 访问D 访问C 访问B 访问E ``` 可以看出,使用第一种方式时,方法的调用顺序按照MRO从左到右的顺序进行;而使用第二种方式时,方法的调用顺序按照定义顺序从左到右依次进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值