python的super使用

本文讲述一下super的使用:python

1:app

class A(object):
    def __init__():
        print "I'm A"
    def test(self):
        print "I'm test"

class B(A):
    def __init__():
        super(B,self).__init__()
    def test_B(self):
        super(B,self).test()
    
b=B()
b.test_B()

运行结果:code

这是简单的调用utf-8

当调用父类比较多的时候,在调用方法是遵循MRO C3线性处理法则,源码以下:源码

#-*- encoding:GBK -*-# 
def mro_C3(*cls):
        print len(cls)
        if len(cls)==1:
            print "hello"
            if not cls[0].__bases__:
                print cls
                return cls
                
            else: 
                return cls+ mro_C3(*cls[0].__bases__) 
        else: 
            seqs = [list(mro_C3(C)) for C in cls ] +[list(cls)] 
            res = [] 
            while True: 
              non_empty = list(filter(None, seqs)) 
              if not non_empty: 
                  return tuple(res) 
              for seq in non_empty: 
                  candidate = seq[0] 
                  not_head = [s for s in non_empty if candidate in s[1:]] 
                  if not_head: 
                      candidate = None 
                  else: 
                      break 
              if not candidate: 
                  raise TypeError("inconsistent hierarchy, no C3 MRO is possible") 
              res.append(candidate) 
              for seq in non_empty: 
                  if seq[0] == candidate:
                      del seq[0] 
class C(object):
          pass
class A(C):     
          pass
class B(C):
          pass


mro_C3(A,B)

简单的讲述一下:it

​

#!/usr/bin/env python
#--*-- coding: utf-8 --*--
class A(object):
    def __init__(self):
        print "enter A"
        print "leave A"

        
class C(A):
    def __init__(self):
        print "enter C "
        super(C,self).__init__()
       
    def c(self):
        print "diaoyongfangfa"

class B(A):
     def __init__(self):
         print "enter B"
         super(B,self).__init__()
        
class D(B,C):
    def __init__(self):
        super(D,self).__init__()
        print "leave D"
        

b = D()
结果:enter B
enter C 
enter A
leave A
leave D
>>> 
​

在调用的时候首先mro(A)=[A,O]class

mro[B]=[B]+merge(mro(A)+[A])test

           =[B]+merge([A,O]+[A])object

遍历执行merge操做的序列,若是一个序列的第一个元素,是其余序列中的第一个元素,或不在其余序列出现,则从全部执行merge操做序列中删除这个元素,合并到当前的mro中。date

因此mro[B]=[B,A]+merge([O])=[B,A,O],同理mro[C]=[C,A,O]

mro[D]=[D]+merge(mro(B)+mro(C)+[B,C])

          =[D]+merge([B,A,O]+[C,A,O]+[B,C])

          =[D,B,C]+merge([A,O]+[A,O])

         =[D,B,C,A]+merge([O]+[O])

         =[D,B,C,A]

因此多父类的时候就遵循这个方式

相关文章
相关标签/搜索