您的位置:首页 > 编程语言 > Python开发

python的super使用

2016-07-20 00:00 387 查看
本文讲述一下super的使用:

1:

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()

运行结果:



这是简单的调用

当调用父类比较多的时候,在调用方法是遵循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)

简单的讲述一下:

​

#!/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]

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

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

遍历执行merge操作的序列,如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中。

所以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]

所以多父类的时候就遵循这个方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: