标签:style class blog code http tar
看了2个blog后还是没闹明白 因为Django的东西 所以自己写了test的例子终于明白了
首先给出结论---->别人总结的可惜一开始没闹明白:
1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,
产生了一个super对象;
2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数
只调用一次(如果每个类都使用super);
5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一
个父类函数被调用多次。
EG.1
class A(object): def __init__(self): print "enter A" print "leave A" class B(object): def __init__(self): print "enter B" print "leave B" class C(A): def __init__(self): print "enter C" super(C, self).__init__() print "leave C" class D(A): def __init__(self): print "enter D" super(D, self).__init__() print "leave D" class E(B, C): def __init__(self): print "enter E" B.__init__(self) C.__init__(self) print "leave E" class F(E, D): def __init__(self): print "enter F" E.__init__(self) D.__init__(self) print "leave F"
f = F() result:
enter F
enter E
enter B
leave B
enter C
enter D
enter A
leave A
leave D
leave C
leave E
enter D
enter A
leave A
leave D
leave F
后面给出的可以更好的理解super
Class A(object):
def Q(self):
print ‘In-A‘
super(A,self).Q()
print ‘out-A‘
Class B(object):
def Q(self):
print ‘In-B‘
print ‘out-B‘
Class C(A,B):
def Q(self):
print ‘In-C‘
super(C,self).Q()
print ‘out-C‘
Class C(B,A):
def Q(self):
print ‘In-C‘
super(C,self).Q()
print ‘out-C
class C分2次去定义
分别运行C().Q()就可以理解了
报告完毕‘
标签:style class blog code http tar
原文地址:http://blog.csdn.net/zouyee/article/details/33737483