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编写一个模仿CPU工作的程序
Apr 16 Python
Python制作词云的方法
Jan 03 Python
Python设计模式之中介模式简单示例
Jan 09 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
Python线程下使用锁的技巧分享
Sep 13 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
python生成xml时规定dtd实例方法
Sep 21 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
Python基础详解之邮件处理
Apr 28 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
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
php简单中奖算法(实例)
2017/08/15 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
PHP实现文件上传与下载
2020/08/28 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
Django+Vue跨域环境配置详解
2018/07/06 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
解决django FileFIELD的编码问题
2020/03/30 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
Pytorch 高效使用GPU的操作
2020/06/27 Python
使用keras实现BiLSTM+CNN+CRF文字标记NER
2020/06/29 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
请解释接口的显式实现有什么意义
2012/05/26 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
大学生标准推荐信范文
2013/11/25 职场文书
在校生自我鉴定
2014/01/23 职场文书
驾驶员培训方案
2014/05/01 职场文书
网络技术专业求职信
2014/07/13 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
PHP遍历数组的6种方式总结
2021/11/17 PHP
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android