python 子类调用父类的构造函数实例
当子类继承父类后,需要调用父类的方法和属性时,需要调用父类的初始化函数。
classA(object):
def__init__(self):
self.nameaa='aa'
deffunca(self):
print('functiona%s'%self.nameaa)
classB(A):
def__init__(self):
self.namebb='bb'
deffuncb(self):
print('functionb%s'%self.namebb)
b=B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()
在子类中重写了构造函数,但新的构造函数没有初始化父类,当没有初始化父类的构造函数时,就会报错。
(1)调用超类的构造方法
classA(object):
def__init__(self):
self.nameaa='aa'
deffunca(self):
print('functiona%s'%self.nameaa)
classB(A):
def__init__(self):
self.namebb='bb'
A.__init__(self)#添加
deffuncb(self):
print('functionb%s'%self.namebb)
b=B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()
(2)使用super函数
classA(object):
def__init__(self):
self.nameaa='aa'
deffunca(self):
print('functiona%s'%self.nameaa)
classB(A):
def__init__(self):
self.namebb='bb'
super(B,self).__init__()
deffuncb(self):
print('functionb%s'%self.namebb)
b=B()
print(b.namebb)
b.funcb()
print(b.nameaa)
b.funca()
super函数返回一个super对象,解析过程自动查找所有的父类和父类的父类,当前类和对象可以作为super函数的参数使用,调用函数返回的方法是超类的方法。使用super函数如果子类继承多个父类只许一次继承,使用一次super函数即可。
如果没有重写子类的构造函数,是可以直接使用父类的属性和方法的。
classA(object):
def__init__(self):
self.nameaa='aa'
deffunca(self):
print('functiona%s'%self.nameaa)
classC(A):
pass
c=C()
c.funca()
print(c.nameaa)
补充知识:python3和python2调用父类构造方法写法区别
1.python3和python2调用父类构造方法写法区别
前一段时间,把之前的一个项目迁移到python3
发现了很多不同的地方.我这里简单说明了,构造方法的不同之后可能会继续更新不同.主要针对项目迁移进行总结,反思.这里就当做笔记.
python3代码调用父类的构造方法
#!/usr/bin/envpython3
#-*-coding:UTF-8-*-
"""
@author:Frank
@contact:frank.chang@shoufuyou.com
@file:py2topy3.py
@time:2018/7/7上午7:09
##python3代码
"""
importthreading
importqueue
_sentinel=object()
classConsumer(threading.Thread):
"""
消费者线程类
"""
def__init__(self,name,queue):
super().__init__(name=name)
self.queue=queue
defrun(self):
whileTrue:
values=self.queue.get(timeout=None)
ifvaluesis_sentinel:
self.queue.put(values)
break
##processvalues
##xxx
print('consumeisconsumingdata{}'.format(values))
print("{}finished".format(self.getName()))
if__name__=='__main__':
q=queue.Queue()
concumser=Consumer('consumer',q)
print(concumser)
2python2.7调用父类的构造方法
#!/usr/bin/envpython3
#-*-coding:UTF-8-*-
"""
@author:Frank
@contact:frank.chang@shoufuyou.com
@file:3.py
@time:2018/7/7上午7:05
"""
importQueue
importthreading
#哨兵
_sentinel=object()
classConsumer(threading.Thread):
"""
消费者线程类
"""
def__init__(self,name,queue):
super(Consumer,self).__init__(name=name)
self.queue=queue
defrun(self):
whileTrue:
values=self.queue.get(timeout=None)
ifvaluesis_sentinel:
self.queue.put(values)
break
##processvalues
##xxx
print('consumeisconsumingdata{}'.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子类调用父类的构造函数实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。