Python中子类调用父类的初始化方法
Python中子类调用父类的初始化方法
前言
python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__
方法重写了父类的__init__
方法,如果在子类中这些属性未经过初始化,使用时就会出错。例如以下的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class A( object ): def __init__( self ): self .a = 5 def function_a( self ): print ( 'I am from A, my value is %d' % self .a) class B(A): def __init__( self ): self .b = 10 def function_b( self ): print ( 'I am from B, my value is %d' % self .b) self .function_a() # 调用类A的方法,出错 if __name__ = = '__main__' : b = B() b.function_b() |
执行结果如下:
这时候就需要在类B的__init__
方法中先执行类A的__init__
方法,脚本才可以正确执行。Python提供了两种方法来完成这个任务。
方法一: 调用未绑定的父类__init__
方法
在类的方法定义时,首个参数均为self。当实例化这个类时,self就被自动绑定到当前的实例。绑定也就意味着这个实例的属性,方法都可以通过‘self.***的方式进行调用。但是如果通过类名直接调用类的方法,self参数就不会被自动绑定到实例上,可以绑定到我们指定的实例上。也就是子类的实例上,在这里就是类B了。
所以这里所说的未绑定的父类__init__方法 就是指未绑定父类实例的父类__init__方法。
具体的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class A( object ): def __init__( self ): self .a = 5 def function_a( self ): print ( 'I am from A, my value is %d' % self .a) class B(A): def __init__( self ): A.__init__( self ) # 此处修改了。如果类A的__init__方法需要传参,也需要传入对应的参数 self .b = 10 def function_b( self ): print ( 'I am from B, my value is %d' % self .b) self .function_a() if __name__ = = '__main__' : b = B() b.function_b() |
执行结果如下:
方法二:调用super
函数
super
函数是用于调用父类的一个方法,主要是用于解决多继承问题,避免多继承带来的一些问题,当然也可以用来解决单继承问题,调用父类的__init__
方法了。
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class A( object ): def __init__( self ): self .a = 5 def function_a( self ): print ( 'I am from A, my value is %d' % self .a) class B(A): def __init__( self ): super (B, self ).__init__() # 此处修改了 self .b = 10 def function_b( self ): print ( 'I am from B, my value is %d' % self .b) self .function_a() if __name__ = = '__main__' : b = B() b.function_b() |
执行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix