读书人

关于python super的用法疑点

发布时间: 2013-01-02 13:08:45 作者: rapoo

关于python super的用法疑问


#!/usr/bin/python
# -*- coding: utf-8 -*-

class A(object):
def __init__(self):
print 'A __init__'
pass

class C(object):
def __init__(self):
print 'C __init__'
pass

class B(A,C):
def __init__(self):
print 'B __init__'
super(B, self).__init__()
print 'leave B'

class D(B):
def __init__(self):
print 'D __init__'
super(D, self).__init__()
print 'leave D'

if __name__ == '__main__':
D()

运行之后, B命名继承了A和C两个类, 可为什么再调用D的时候, B只调用了A类的构造函数, 而不调用C的. 麻烦讲下原理 多谢
[解决办法]
关于这个请看python之父Guido van Rossum的这篇博文:Method Resolution Order

你这个这个D类的搜索路径为:D,B,A,C,
所以super(D).__init__()找到基类A.__init__()后会直接调用,并返回,

[解决办法]
同时调用A和C初始函数的话,初始函数里要都带super...
class A(object):
def __init__(self):
print 'A __init__'
super(A, self).__init__()
print 'leave A'

class C(object):
def __init__(self):
print 'C __init__'
super(C, self).__init__()
print 'leave C'

class B(A,C):
def __init__(self):
print 'B __init__'
super(B, self).__init__()
print 'leave B'

class D(B):
def __init__(self):
print 'D __init__'
super(D, self).__init__()
print 'leave D'

if __name__ == '__main__':
D()

读书人网 >perl python

热点推荐