python 子类调用父类的构造函数实例

 更新时间:2020年03月12日 10:25:39   作者:homle  
这篇文章主要介绍了python 子类调用父类的构造函数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

当子类继承父类后,需要调用父类的方法和属性时,需要调用父类的初始化函数。

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()

在子类中重写了构造函数,但新的构造函数没有初始化父类,当没有初始化父类的构造函数时,就会报错。

(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()

(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()

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)

补充知识: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 子类调用父类的构造函数实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Django添加KindEditor富文本编辑器的使用

    Django添加KindEditor富文本编辑器的使用

    今天小编就为大家分享一篇关于Django添加KindEditor富文本编辑器的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 手把手教你打造个性化全栈应用Python Reflex框架全面攻略

    手把手教你打造个性化全栈应用Python Reflex框架全面攻略

    Reflex框架是为了解决传统全栈开发中的一些挑战而诞生的,它充分利用了现代前端框架(如React)的优势,与后端技术(如Node.js)深度集成,使得开发者能够更加流畅地构建整个应用,Reflex的设计理念包括简化、响应性和一致性,旨在提高全栈开发的效率和可维护性
    2023-12-12
  • python数据处理实战(必看篇)

    python数据处理实战(必看篇)

    下面小编就为大家带来一篇python数据处理实战(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Python利用itchat库向好友或者公众号发消息的实例

    Python利用itchat库向好友或者公众号发消息的实例

    今天小编就为大家分享一篇Python利用itchat库向好友或者公众号发消息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python中win32com模块的使用

    Python中win32com模块的使用

    本文主要介绍了Python中win32com模块的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • python实战之制作表情包游戏

    python实战之制作表情包游戏

    想知道如何制作表情包游戏吗?用Python就可以搞定!本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python 多进程并行编程 ProcessPoolExecutor的实现

    python 多进程并行编程 ProcessPoolExecutor的实现

    这篇文章主要介绍了python 多进程并行编程 ProcessPoolExecutor的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 解析Tensorflow之MNIST的使用

    解析Tensorflow之MNIST的使用

    这篇文章主要介绍了解析Tensorflow之MNIST的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 将Python代码打包成.exe可执行文件的完整步骤

    将Python代码打包成.exe可执行文件的完整步骤

    这篇文章主要给大家介绍了关于如何将Python代码打包成.exe可执行文件的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Python入门教程(三十九)Python的NumPy安装与入门

    Python入门教程(三十九)Python的NumPy安装与入门

    这篇文章主要介绍了Python入门教程(三十九)Python的NumPy安装与入门,NumPy 是一个Python包,它是一个由多维数组对象和用于处理数组的例程集合组成的库,,需要的朋友可以参考下
    2023-05-05

最新评论