前言
python中进行面向对象编程,当在子类的实例中调用父类的属性时,由于子类的__init__方法重写了父类的__init__方法,如果在子类中这些属性未经过初始化,使用时就会出错。
例如以下的代码:
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__方法。
具体的代码如下:
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__方法了。
具体代码如下:
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()
执行结果如下:
总结
两种方法各有优缺点,但都可以解决问题。
- 方法一简单直观,但面对多继承问题,只能多次调用每个父类的__init__方法
- 方法二不太直观,但可以解决多继承问题,会一次性的执行所有的父类的对应方法
所以实际使用时,按照自己的需要选择一个就行了。
以上这篇Python实现子类调用父类的初始化实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?