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执行使用shell命令方法分享
Nov 08 Python
基于DataFrame改变列类型的方法
Jul 25 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python 自定义装饰器实例详解
Jul 20 Python
Python依赖包整体迁移方法详解
Aug 15 Python
python多线程同步之文件读写控制
Feb 25 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
Apr 08 Python
PyTorch如何搭建一个简单的网络
Aug 24 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 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 无限级 SelectTree 类
2009/05/19 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
AngularJS 过滤与排序详解及实例代码
2016/09/14 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
keras实现多种分类网络的方式
2020/06/11 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
介绍一下except的用法和作用
2015/01/22 面试题
优秀高中生事迹材料
2014/02/11 职场文书
工作失误检讨书范文
2015/01/26 职场文书
应届毕业生自荐信
2015/03/04 职场文书
超市督导岗位职责
2015/04/10 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js