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创建日历实例
Aug 21 Python
浅谈Python中的数据类型
May 05 Python
Python 的内置字符串方法小结
Mar 15 Python
浅谈Django的缓存机制
Aug 23 Python
Python sorted函数详解(高级篇)
Sep 18 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
Django 多对多字段的更新和插入数据实例
Mar 31 Python
Python pip使用超时问题解决方案
Aug 03 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 Python
方法汇总:Python 安装第三方库常用
Apr 26 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之第一天
2006/10/09 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
JavaScript实现网页上的浮动广告的简单方法
2013/06/14 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python中偏函数用法示例
2018/06/07 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
大学生职业规划书的范本
2014/02/18 职场文书
党风廉政建设责任书
2014/04/14 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
投资入股合作协议书
2014/10/28 职场文书
2015年教师节活动总结
2015/03/20 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
前端JavaScript大管家 package.json
2021/11/02 Javascript
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技