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字典DICT类型合并详解
Aug 17 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Python错误处理操作示例
Jul 18 Python
Python如何实现转换URL详解
Jul 02 Python
在Python函数中输入任意数量参数的实例
Jul 16 Python
Python模块future用法原理详解
Jan 20 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
Python常用编译器原理及特点解析
Mar 23 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
Apr 14 Python
Python eval函数介绍及用法
Nov 09 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
python周期任务调度工具Schedule使用详解
Nov 23 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 array_search() 函数使用
2010/04/13 PHP
php中设置多级目录session的问题
2011/08/08 PHP
PHP异常处理浅析
2015/05/12 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
javascript常用的方法分享
2015/07/01 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
Python 多线程抓取图片效率对比
2016/02/27 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
python 如何区分return和yield
2020/09/22 Python
如何完美的建立一个python项目
2020/10/09 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
销售经理工作职责
2014/02/03 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
个人授权委托书范本
2014/09/14 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS