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中的Queue与多进程
Aug 25 Python
对Python中的@classmethod用法详解
Apr 21 Python
python用线性回归预测股票价格的实现代码
Sep 04 Python
python实现的发邮件功能示例
Sep 11 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
基于python判断目录或者文件代码实例
Nov 29 Python
python 创建一维的0向量实例
Dec 02 Python
PyQt5实现画布小程序
May 30 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
记一次django内存异常排查及解决方法
Aug 07 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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代码包装修正版
2008/03/15 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
jquery下为Event handler传递动态参数的代码
2011/01/06 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
实现只能输入数字的input不用replace方法
2013/09/12 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python抓取百度查询结果的方法
2015/07/08 Python
Python简单读取json文件功能示例
2017/11/30 Python
浅谈Python中的私有变量
2018/02/28 Python
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
反洗钱宣传活动总结
2014/08/26 职场文书
心得体会的写法
2014/09/05 职场文书
产品质量保证书范本
2015/02/27 职场文书
2015年领班工作总结
2015/04/29 职场文书
2015年安置帮教工作总结
2015/05/22 职场文书
英文投诉信格式
2015/07/03 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis
JS setTimeout与setInterval的区别
2022/04/20 Javascript