码迷,mamicode.com
首页 > 编程语言 > 详细

Python Super

时间:2014-06-24 18:39:17      阅读:342      评论:0      收藏:0      [点我收藏+]

标签: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"
bubuko.com,布布扣

  f = F() result:

bubuko.com,布布扣
bubuko.com,布布扣
 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
bubuko.com,布布扣
这个可以看懂吧?

后面给出的可以更好的理解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()就可以理解了

报告完毕‘





Python Super,布布扣,bubuko.com

Python Super

标签:style   class   blog   code   http   tar   

原文地址:http://blog.csdn.net/zouyee/article/details/33737483

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!