前言

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实现子类调用父类的初始化实例相关推荐

  1. Java继承,子类默认在构造函数中用super()调用父类构造函数

    1.子类继承父类的方法属性,并重写父类的方法,子类修饰符不能比父类方法的修饰符的范围狭窄. 2.子类必须在构造函数中使用super()来调用父类的构造函数 说明:1.父类没有写构造函数(系统默认有一个 ...

  2. Animal animal = new Dog(); 子类会什么一定要先调用父类的构造方法且必须写在第一行

    一个类只要有父类,那么在它实例化的时候,一定是从顶级的父类开始创建.对于Java来说要一直追述到Object ,因为 内存中如果没有先创建好父类,子类怎么调用父类的方法呢?如 object 的 has ...

  3. android继承父类的界面,Android调用父类方法,进行子界面刷新

    偶然遇到一个需求.有几个主界面需要获取消息的未读数量 由于不是所有类都调用.调用的次数又比较多,整的不上不下的 1.对于方法调用次数比较少的 推荐广播 广播的方法很方便.但是一堆的消息接收.发送很模式 ...

  4. python timer怎么用_python定时器(Timer)用法简单实例

    python定时器(Timer)用法简单实例 本文实例讲述了python定时器(Timer)用法.分享给大家供大家参考.具体如下: # encoding: UTF-8 import threading ...

  5. python调用父类构造函数需要放在第一句吗_Python继承和调用父类构造函数

    这是我正在Python中做的: class BaseClass: def __init__(self): print 'The base class constructor ran!' self.__ ...

  6. python怎么创建函数_Python创建与调用函数

    今天我们来讲Python里的创建与调用函数. 先讲创建函数,创建函数使用def关键字,就是define的缩写. 上代码看看吧: def say(info): print(info) 这就是一个名叫sa ...

  7. python 继承多个父类_python多继承及父类出现同名方法的处理

    多继承英文叫MultipleInheritance.在python中,一个A类可以继承B类,也可以同时继承B类和C类,这就是多继承.多继承有更复杂的情况,比如B类和C类还继承了D类和F类等等.本节课我 ...

  8. python测试rpc接口_python使用grpc调用rpc接口

    #Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! importgrpcimportcoupon_pb2 as c ...

  9. python执行sqlserver存储过程_python – 从SqlAlchemy调用MSSQL存储过程

    看起来SqlAlchemy似乎不支持调用存储过程.有没有人找到适用于SQL Server的解决方法? 样品程序: CREATE PROCEDURE list_lock_set @name varcha ...

最新文章

  1. 爬虫-selenium初步学习与使用!
  2. 锐捷大中型企业VLAN网络方案
  3. linux常用安装命令集锦
  4. 关于软件版本命名的方法
  5. c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
  6. 测试用例集-9.QQ登录功能测试用例
  7. SD-WAN(软件定义WAN)
  8. 找出冲突的Windows快捷键
  9. jSignature网页手写签名
  10. 上星远程控制实验(一)
  11. 《程序员之禅》一一1.1 我如何学习打坐
  12. 商用密码产品认证-金融数据密码机
  13. 程序员如何提高自己的能力
  14. iGame最强Z370VulcanX主板:为第八代酷睿蓄势待发
  15. 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
  16. 头歌 6. Pandas合并数据集
  17. GitHub使用中的错误及解决办法
  18. Error: docker-ce-cli conflicts with 2:docker-1.13.1-209.git7d71120.el7.centos.x86_64
  19. php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块
  20. C++的名字空间(很重要)

热门文章

  1. 使用BootStrapValidator来完成前端输入验证
  2. 360前端负责人月影:赛跑项目和跳水项目的金牌含量其实一样
  3. 【NOIP模拟题】“与”(位运算)
  4. (转)ASIHTTPRequest 详解, http 请求终结者
  5. How Many Replication Method In SAP HANA
  6. 稳扎稳打Silverlight(8) - 2.0图形之基类System.Windows.Shapes.Shape
  7. javaweb学习总结(四十四)——监听器(Listener)学习
  8. 怎么样快速学习AngularJS?
  9. 解决网站在负载均衡环境下SESSION丢失的问题
  10. jQuery同步Ajax带来的UI线程阻塞问题及解决办法