python 子类调用父类的构造函数实例


Posted in Python onMarch 12, 2020

当子类继承父类后,需要调用父类的方法和属性时,需要调用父类的初始化函数。

class A(object):
  def __init__(self):
    self.nameaa = 'aa'
  def funca(self):
    print('function a %s' % self.nameaa)
    
class B(A):
  def __init__(self):
    self.namebb = 'bb'
 def funcb(self):
    print('function b %s' % self.namebb)
    
b = B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()

在子类中重写了构造函数,但新的构造函数没有初始化父类,当没有初始化父类的构造函数时,就会报错。

python 子类调用父类的构造函数实例

(1)调用超类的构造方法

class A(object):
  def __init__(self):
    self.nameaa = 'aa'
  def funca(self):
    print('function a %s' % self.nameaa)
    
class B(A):
  def __init__(self):
    self.namebb = 'bb'
    A.__init__(self)    #添加
  def funcb(self):
    print('function b %s' % self.namebb)
    
b = B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()

python 子类调用父类的构造函数实例

(2)使用super函数

class A(object):
  def __init__(self):
    self.nameaa = 'aa'
  def funca(self):
    print('function a %s' % self.nameaa)
    
class B(A):
  def __init__(self):
    self.namebb = 'bb'
    super(B,self).__init__()
  def funcb(self):
    print('function b %s' % self.namebb)
    
b = B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()

python 子类调用父类的构造函数实例

super函数返回一个super对象,解析过程自动查找所有的父类和父类的父类,当前类和对象可以作为super函数的参数使用,调用函数返回的方法是超类的方法。使用super函数如果子类继承多个父类只许一次继承,使用一次super函数即可。

如果没有重写子类的构造函数,是可以直接使用父类的属性和方法的。

class A(object):
  def __init__(self):
    self.nameaa = 'aa'
  def funca(self):
    print('function a %s' % self.nameaa)
    
class C(A):
  pass
c = C()
c.funca()
print(c.nameaa)

python 子类调用父类的构造函数实例

补充知识:python3 和python2 调用父类构造方法写法区别

1. python3 和python2 调用父类构造方法写法区别

前一段时间,把之前的一个项目迁移到python3

发现了很多不同的地方.我这里简单说明了,构造方法的不同 之后可能会继续更新不同. 主要针对项目迁移进行总结,反思. 这里就当做笔记.

python3 代码 调用父类的构造方法

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: Frank 
@contact: frank.chang@shoufuyou.com
@file: py2topy3.py
@time: 2018/7/7 上午7:09
## python3 代码 
 
"""
 
import threading
import queue
 
_sentinel = object()
 
 
class Consumer(threading.Thread):
  """
  消费者线程类
  """
 
  def __init__(self, name, queue):
    super().__init__(name=name)
    self.queue = queue
 
  def run(self):
    while True:
      values = self.queue.get(timeout=None)
 
      if values is _sentinel:
        self.queue.put(values)
        break
      ##process values
      ##xxx
      print('consume is consuming data {}'.format(values))
 
    print("{} finished".format(self.getName()))
 
 
if __name__ == '__main__':
  q = queue.Queue()
  concumser = Consumer('consumer', q)
 
  print(concumser)

2 python2.7 调用父类的构造方法

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@author: Frank 
@contact: frank.chang@shoufuyou.com
@file: 3.py
@time: 2018/7/7 上午7:05
"""
 
import Queue
import threading
 
# 哨兵
_sentinel = object()
 
 
class Consumer(threading.Thread):
  """
  消费者线程类
  """
 
  def __init__(self, name, queue):
    super(Consumer, self).__init__(name=name)
    self.queue = queue
 
  def run(self):
    while True:
      values = self.queue.get(timeout=None)
 
      if values is _sentinel:
        self.queue.put(values)
        break
      ##process values
      ##xxx
      print('consume is consuming data {}'.format(values))
 
    print("{} finished".format(self.getName()))
 
 
if __name__ == '__main__':
  q = Queue.Queue()
  concumser = Consumer('consumer', q)
  print(concumser)

区别

主要区别是 super 的变化,

python3 中直接 super().init() 中 super 不需要传递任何参数,直接可以调用父类的构造方法

python2 中 super(Consumer, self).init(), 需要传两个参数一个是类名, 一个是self. 这样比较麻烦,很容易混淆. 但是python3 这里处理的比较好了.

可以看下这个文档 https://docs.python.org/3/library/functions.html#super

顺便提一下, python2 和python3 中 quque 名称换了,python3 用的是小写 作为模块名称.

以上这篇python 子类调用父类的构造函数实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用struct处理二进制的实例详解
Sep 11 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
python读取csv文件并把文件放入一个list中的实例讲解
Apr 27 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
Python和Go语言的区别总结
Feb 20 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
解决python 读取 log日志的编码问题
Dec 24 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
keras 多任务多loss实例
Jun 22 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
python3中sorted函数里cmp参数改变详解
Mar 12 #Python
Python实现子类调用父类的初始化实例
Mar 12 #Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 #Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 #Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 #Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 #Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 #Python
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
德劲1103二次变频版的打磨
2021/03/02 无线电
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
[00:23]DOTA2群星共贺开放测试 25日无码时代来袭
2013/09/23 DOTA
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
python将unicode转为str的方法
2017/06/21 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
基于opencv实现简单画板功能
2020/08/02 Python
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
幼儿园运动会加油词
2014/02/14 职场文书
班班通校本培训方案
2014/03/12 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
创先争优承诺书
2015/01/20 职场文书
运动会200米广播稿
2015/08/19 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
SpringBoot整合Minio文件存储
2022/04/03 Java/Android