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 相关文章推荐
Django的session中对于用户验证的支持
Jul 23 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
python用户管理系统的实例讲解
Dec 23 Python
python内置数据类型之列表操作
Nov 12 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
学Python 3的理由和必要性
Nov 19 Python
Python list运算操作代码实例解析
Jan 20 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Django展示可视化图表的多种方式
Apr 08 Python
Python使用OpenCV实现虚拟缩放效果
Feb 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接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
vue元素实现动画过渡效果
2017/07/01 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
对python requests的content和text方法的区别详解
2018/10/11 Python
python之yield和Generator深入解析
2019/09/18 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
会计自我鉴定范文
2013/10/06 职场文书
公司副总经理任命书
2014/06/05 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
个人创业事迹材料
2014/12/30 职场文书
使用python创建股票的时间序列可视化分析
2022/03/03 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏
分享Python异步爬取知乎热榜
2022/04/12 Python