python子类调用父类的方法
2017-07-12 20:15
375 查看
python子类调用父类的方法
2013/10/09 by Crazyant2 Comments
python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法。如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找。
继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的。
子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题
如果子类和父类都有构造函数,子类其实是重写了父类的构造函数,如果不显式调用父类构造函数,父类的构造函数就不会被执行,导致子类实例访问父类初始化方法中初始的变量就会出现问题。<
4000
div class="crayon-button crayon-plain-button" title="纯文本显示代码" style="font-family:inherit;background:no-repeat 0px center;border:0px;padding:0px;margin:0px;line-height:15px;display:inline;font-size: !important;font-weight: !important;float:left !important;">
12345678910111213141516171819 | class A: def __init__(self): self.namea="aaa" def funca(self):< 21118 span class="crayon-h" style="font-family:inherit;font-size: !important;line-height: !important;font-weight: !important;color:rgb(0,111,224) !important;"> print "function a : %s"%self.namea class B(A): def __init__(self): self.nameb="bbb" def funcb(self): print "function b : %s"%self.nameb b=B()print b.namebb.funcb() b.funca() |
1 2 3 4 5 6 7 8 | bbb function b : bbb Traceback (most recent call last): File "D:\workbench\python\MyPythonProject\test\study\overwrite_method.py", line 19, in <module> b.funca() File "D:\workbench\python\MyPythonProject\test\study\overwrite_method.py", line 6, in funca "function a : %s"%self.namea AttributeError: B instance has no attribute 'namea' |
方法一:调用未绑定的超类构造方法
修改代码,多增一行:12345678910111213141516171819202122 | class A: def __init__(self): self.namea="aaa" def funca(self): print "function a : %s"%self.namea class B(A): def __init__(self): #这一行解决了问题 A.__init__(self) self.nameb="bbb" def funcb(self): print "function b : %s"%self.nameb b=B()print b.namebb.funcb() b.funca() |
方法二:使用super函数
修改代码,这次需要增加在原来代码上增加2行:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #父类需要继承object对象 class A(object): def __init__(self): self.namea="aaa" def funca(self): "function a : %s"%self.namea class B(A): def __init__(self): #这一行解决问题 super(B,self).__init__() self.nameb="bbb" def funcb(self): "function b : %s"%self.nameb b=B() b.nameb b.funcb() b.funca() |
super函数会返回一个super对象,这个对象负责进行方法解析,解析过程其会自动查找所有的父类以及父类的父类。
方法一更直观,方法二可以一次初始化所有超类
super函数比在超累中直接调用未绑定方法更直观,但是其最大的有点是如果子类继承了多个父类,它只需要使用一次super函数就可以。然而如果没有这个需求,直接使用A.__init__(self)更直观一些。
相关文章推荐
- Python实现子类调用父类的方法
- python学习笔记:子类怎样调用父类方法
- [转python 父类可以调用子类的方法
- python中子类调用父类的初始化方法
- Python 父类调用子类方法的问题
- python中子类调用父类构造方法
- Python3基础 super层层调用父类的__init__方法 子类的__init__覆盖了父类的__init__的解决方法
- 【Python】Python中子类怎样调用父类方法
- python子类调用父类的方法
- Python开发基础-Day20继承实现原理、子类调用父类的方法、封装
- Python实现子类调用父类的方法
- Python学习笔记--子类调用父类方法
- python子类如何调用父类的__init__方法
- python基础之继承实现原理、子类调用父类的方法、封装
- python中子类调用父类方法几点细节(正确使用super)
- python子类调用父类的方法
- python子类调用父类的方法-super
- Python 子类调用父类的方法
- Python 父类调用子类方法
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法