源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

总结python实现父类调用两种方法的不同

  • 时间:2022-07-04 14:48 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:总结python实现父类调用两种方法的不同
[b]python中有两种方法可以调用父类的方法:[/b] [code]super(Child, self).method(args)[/code]  [code]Parent.method(self, args)[/code] [b]我用其中的一种报了如下错误:[/b] [img]http://files.jb51.net/file_images/article/201701/2017115194333888.png?2017015194345[/img] 找不到 classobj。当我把调用改为 [code]super(B, self).f(name)[/code] 就能正确运行,且结果正确。 [b]分析错误 [/b] 因为基类没有继承 object , 在python中,一个可以这样创建:
class A:
 pass
也可以这样创建:
class A(object):
 pass
[b]这两者的区别就是:[/b] [img]http://files.jb51.net/file_images/article/201701/2017115194442799.png?2017015194456[/img] 这是老式类(前者)和新式类(后者)的区别。区别可以参考:[url=https://docs.python.org/release/2.5.2/ref/node33.html]https://docs.python.org/release/2.5.2/ref/node33.html[/url] python3已经把旧类型去掉了,也就是说已经隐式继承了object,所以,python3中写不写继承object都是没有区别的 [b]两种调用的区别[/b] [code]Parent.__init__(self) [/code]与 [code]super(Child, self).__init__() [/code]的区别是什么? 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类的构造函数使用 [code]super(E, self).__init__() [/code]时,A类的构造函数会被执行一次,而用另一种方法,A类的构造函数会被执行多次。 在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。 [b]总结[/b] 个人觉得,复杂的继承结构是设计中不良的设计,当继承结构清晰后,两个方法其实就没什么区别了。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部