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 multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
详解Python各大聊天系统的屏蔽脏话功能原理
Dec 01 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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与MySQL交互使用详解
2006/10/09 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
JS使用Date对象实时显示当前系统时间简单示例
2018/08/23 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
python使用pycharm环境调用opencv库
2018/02/11 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
django的csrf实现过程详解
2019/07/26 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
python 浅谈serial与stm32通信的编码问题
2019/12/18 Python
什么是Python变量作用域
2020/06/03 Python
Python中的Cookie模块如何使用
2020/06/04 Python
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
幼儿如何来做好自我评价
2013/11/05 职场文书
采购内勤岗位职责
2013/12/10 职场文书
移风易俗倡议书
2014/04/15 职场文书
庆祝国庆节标语
2014/10/09 职场文书
写给老师的感谢信
2015/01/20 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
小学班主任研修日志
2015/11/13 职场文书
灵能百分百第三季什么时候来?
2022/03/15 日漫