你好,游客 登录 注册 发布搜索
背景:
阅读新闻

python调用父类方法

[日期:2016-12-16] 来源:栖迟於一丘  作者: [字体: ]

起步

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 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。

收藏 推荐 打印 | 录入:Cstor | 阅读:
相关新闻       Python 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
热门评论