python子类初始化父类_Python实现子类调用父类的初始化实例
前言
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实现子类调用父类的初始化实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
本文标题: Python实现子类调用父类的初始化实例
本文地址: http://www.cppcns.com/jiaoben/python/302789.html
python子类初始化父类_Python实现子类调用父类的初始化实例相关推荐
- Java继承,子类默认在构造函数中用super()调用父类构造函数
1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄. 2.子类必须在构造函数中使用super()来调用父类的构造函数 说明:1.父类没有写构造函数(系统默认有一个 ...
- Animal animal = new Dog(); 子类会什么一定要先调用父类的构造方法且必须写在第一行
一个类只要有父类,那么在它实例化的时候,一定是从顶级的父类开始创建.对于Java来说要一直追述到Object ,因为 内存中如果没有先创建好父类,子类怎么调用父类的方法呢?如 object 的 has ...
- android继承父类的界面,Android调用父类方法,进行子界面刷新
偶然遇到一个需求.有几个主界面需要获取消息的未读数量 由于不是所有类都调用.调用的次数又比较多,整的不上不下的 1.对于方法调用次数比较少的 推荐广播 广播的方法很方便.但是一堆的消息接收.发送很模式 ...
- python timer怎么用_python定时器(Timer)用法简单实例
python定时器(Timer)用法简单实例 本文实例讲述了python定时器(Timer)用法.分享给大家供大家参考.具体如下: # encoding: UTF-8 import threading ...
- python调用父类构造函数需要放在第一句吗_Python继承和调用父类构造函数
这是我正在Python中做的: class BaseClass: def __init__(self): print 'The base class constructor ran!' self.__ ...
- python怎么创建函数_Python创建与调用函数
今天我们来讲Python里的创建与调用函数. 先讲创建函数,创建函数使用def关键字,就是define的缩写. 上代码看看吧: def say(info): print(info) 这就是一个名叫sa ...
- python 继承多个父类_python多继承及父类出现同名方法的处理
多继承英文叫MultipleInheritance.在python中,一个A类可以继承B类,也可以同时继承B类和C类,这就是多继承.多继承有更复杂的情况,比如B类和C类还继承了D类和F类等等.本节课我 ...
- python测试rpc接口_python使用grpc调用rpc接口
#Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! importgrpcimportcoupon_pb2 as c ...
- python执行sqlserver存储过程_python – 从SqlAlchemy调用MSSQL存储过程
看起来SqlAlchemy似乎不支持调用存储过程.有没有人找到适用于SQL Server的解决方法? 样品程序: CREATE PROCEDURE list_lock_set @name varcha ...
最新文章
- 爬虫-selenium初步学习与使用!
- 锐捷大中型企业VLAN网络方案
- linux常用安装命令集锦
- 关于软件版本命名的方法
- c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
- 测试用例集-9.QQ登录功能测试用例
- SD-WAN(软件定义WAN)
- 找出冲突的Windows快捷键
- jSignature网页手写签名
- 上星远程控制实验(一)
- 《程序员之禅》一一1.1 我如何学习打坐
- 商用密码产品认证-金融数据密码机
- 程序员如何提高自己的能力
- iGame最强Z370VulcanX主板:为第八代酷睿蓄势待发
- 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
- 头歌 6. Pandas合并数据集
- GitHub使用中的错误及解决办法
- Error: docker-ce-cli conflicts with 2:docker-1.13.1-209.git7d71120.el7.centos.x86_64
- php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块
- C++的名字空间(很重要)
热门文章
- 使用BootStrapValidator来完成前端输入验证
- 360前端负责人月影:赛跑项目和跳水项目的金牌含量其实一样
- 【NOIP模拟题】“与”(位运算)
- (转)ASIHTTPRequest 详解, http 请求终结者
- How Many Replication Method In SAP HANA
- 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
- javaweb学习总结(四十四)——监听器(Listener)学习
- 怎么样快速学习AngularJS?
- 解决网站在负载均衡环境下SESSION丢失的问题
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法