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多重继承实例
Oct 11 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
Python实现的单向循环链表功能示例
Nov 10 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python3爬虫怎样构建请求header
Dec 23 Python
python实现知乎高颜值图片爬取
Aug 12 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
Tensorflow训练MNIST手写数字识别模型
Feb 13 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
用python写爬虫简单吗
Jul 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
留言板翻页的实现详解
2006/10/09 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
smarty基础之拼接字符串的详解
2013/06/18 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
关于php开启错误提示的总结
2019/09/24 PHP
js函数调用常用方法详解
2012/12/03 Javascript
js模仿html5 placeholder适应于不支持的浏览器
2013/01/13 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
python的命名规则知识点总结
2019/10/04 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
python正则表达式实例代码
2020/03/03 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
小学生读书感言
2014/02/12 职场文书
安全生产责任书范本
2014/04/15 职场文书
禁止酒驾标语
2014/06/25 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server