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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。