您好,登录后才能下订单哦!
使用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)
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。