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 从远程服务器下载日志文件的程序
Feb 10 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
Jun 05 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
Python数据类型之Number数字操作实例详解
May 08 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
浅谈怎么给Python添加类型标注
Jun 08 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
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP 实现缩略图
2021/03/09 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
js命名空间写法示例
2015/12/18 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
react-native 实现购物车滑动删除效果的示例代码
2021/01/15 Javascript
Python访问MySQL封装的常用类实例
2014/11/11 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
python构建深度神经网络(DNN)
2018/03/10 Python
python hook监听事件详解
2018/10/25 Python
Python Process多进程实现过程
2019/10/22 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
校园达人秀策划书
2014/01/12 职场文书
七一讲话心得体会
2014/09/05 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
贷款担保书
2015/01/20 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
详解flex:1什么意思
2022/07/23 HTML / CSS