最近在工作中实现父类调用的时候发现了一个错误,然后通过分析实践总结出来了,下面这篇文章主要给大家总结了 python 中实现父类调用两种方法的不同之处, 需要的朋友可以参考借鉴,下面来一起看看吧。
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
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
这两者的区别就是:
这是老式类 (前者) 和新式类 (后者) 的区别。区别可以参考:{aa0aa}
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 类的构造函数使用
时,A 类的构造函数会被执行一次,而用另一种方法,A 类的构造函数会被执行多次。
- super(E, self).__init__()
在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。
总结
来源: http://www.phperz.com/article/17/0316/320380.html