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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
python使用正则表达式检测密码强度源码分享
Jun 11 Python
对于Python中RawString的理解介绍
Jul 07 Python
Python函数的周期性执行实现方法
Aug 13 Python
Python Flask-web表单使用详解
Nov 18 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
Pycharm+Python+PyQt5使用详解
Sep 25 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
详解Python IO编程
Jul 24 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
python判断元素是否存在的实例方法
Sep 24 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
php无限级分类实现方法分析
2016/10/19 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue头部导航动态点击处理方法
2018/11/02 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Python max内置函数详细介绍
2016/11/17 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
Python assert关键字原理及实例解析
2019/12/13 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
如何通过命令行进入python
2020/07/06 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
普师专业个人自荐信范文
2013/11/26 职场文书
人力资源主管职责范本
2014/03/05 职场文书
国际贸易系求职信
2014/08/09 职场文书
python基础之匿名函数详解
2021/04/21 Python
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis