总结python实现父类调用两种方法的不同
2017-01-15 19:47
716 查看
python中有两种方法可以调用父类的方法:
super(Child, self).method(args)
Parent.method(self, args)
我用其中的一种报了如下错误:
找不到 classobj。当我把调用改为
super(B, self).f(name)就能正确运行,且结果正确。
分析错误
因为基类没有继承 object , 在python中,一个可以这样创建:
class A: pass
也可以这样创建:
class A(object): pass
这两者的区别就是:
这是老式类(前者)和新式类(后者)的区别。区别可以参考:https://docs.python.org/release/2.5.2/ref/node33.html
python3已经把旧类型去掉了,也就是说已经隐式继承了object,所以,python3中写不写继承object都是没有区别的
两种调用的区别
Parent.__init__(self)与
super(Child, self).__init__()的区别是什么?
super 理解成父类也是理所当然,python里其实指的是 MRO 中的下一个类!
super其实干了这件事,看这个答案:
def super(cls, inst): mro = inst.__class__.mro() # Always the most derived class return mro[mro.index(cls) + 1]
MRO 全称 Method Resolution Order,它代表了类继承的顺序。
super 是用来解决多重继承问题的,假设B C D 都是直接继承class A
class E(B, C, D): def __init__(self): # code...
如果E类的构造函数使用
super(E, self).__init__()时,A类的构造函数会被执行一次,而用另一种方法,A类的构造函数会被执行多次。
在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。
总结
个人觉得,复杂的继承结构是设计中不良的设计,当继承结构清晰后,两个方法其实就没什么区别了。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助。
您可能感兴趣的文章:
相关文章推荐
- Python实现子类调用父类的方法
- Python实现子类调用父类的方法
- java反射中两种方法的不同(反射能否实现对类的私有方法的调用)
- Python实现调用另一个路径下py文件中的函数方法总结
- Python实现子类调用父类的方法
- python基础之继承实现原理、子类调用父类的方法、封装
- Python开发基础-Day20继承实现原理、子类调用父类的方法、封装
- 使用委托实现了在循环中调用不同的方法
- 用js实现多域名不同文件的调用方法
- [zz]如何在Python中调用父类的同名方法
- [转载]:C#两种不同的存储过程调用方法
- Android中两种不同的方法实现实时更新时间,是显示时间和系统时间同步
- python,java和php派生类调用父类方法说明
- Python中子类怎样调用父类方法
- 两种不同的存储过程调用方法
- 用js实现多域名不同文件的调用方法
- 要实现线程调用带参数的方法有两种办法。
- JAVA笔试题总结3:父类构造器调用被子类重写方法
- java调用webservice用是axis还是xfire的,两种调用方法不同
- 生产者与消费者问题是典型的同步问题。这里简单介绍两种不同的实现方法。