在Python中子类继承父类的过程中,如果子类不覆盖父类的__init__()方法,则子类默认将执行与父类一样的初始化方法。但是假如子类自己重写了(也成为覆盖)父类的__init__()方法,那么就需要显式的调用父类的初始化方法了。有两种方法可以做到:
1:ParentClass.__init__(),父类名加上init函数
2:super(type,cls).__init__()
重点介绍下这个,这个也是Python在借鉴了C++和JAVA的经验后,做出的改进语言熟悉程度的一种努力。
super(type,cls)实质上是super类的3个静态方法之一。
参考下super类的定义:
class super(object)
super(type) -> unbound super object
super(type, obj) -> bound super object; requires isinstance(obj, type)
super(type, type2) -> bound super object; requires issubclass(type2, type)
Typical use to call a cooperative superclass method:
class C(B):
def meth(self, arg):
super(C, self).meth(arg)
从图上可以看出,我们实质上在调用的是第二个方法,其中第一个参数是开始寻找父类的起始点(起始但不包括),第二个参数是需要一个对应第一个type的实例,即满足isinstance(obj,type),这个方法将返回第一个满足继承关系的类,寻找顺序遵从type.__mro__属性顺序(不妨将它认为是倒树的广度优先遍历顺序)。
这个方法的好处在于将类之间的构造方法调用的耦合关系彻底解耦了。如果改变了当前Class,只需要适当的改变下super的第一个参数即可。
分享到:
2011-05-15 20:25
浏览 17026
评论
4 楼
bestchenwu
2011-05-17
哈哈 ~~~
小弟遵命~~
3 楼
haoningabc
2011-05-16
小陈童鞋,能不能把哥名字去掉呢,最近追杀哥的MM比较多
2 楼
bestchenwu
2011-05-15
哈哈
想不到像俺这种草民也会有郝宁哥光临,倍感荣幸~~
1 楼
haoningabc
2011-05-15
不错,很精辟,这种博客继续发啊