有如下继承关系:
#python 2.7
class GrandFather:
def __init__(self):
print('grandfather')
print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
self.define_model()
def define_model(self):
pass
class Father(GrandFather):
def __init__(self):
print('father')
print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
self.define_model()
def define_model(self):
print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
class Son(Father):
def __init__(self):
print('son')
print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
def define_model(self):
print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
s = Son()
print('s \'s addr: {}'.format(s))
输出:
son
---Son's __init__ with addr: <__main__.Son instance at 0x7fcba6f55e60>
s 's addr: <__main__.Son instance at 0x7fcba6f55e60>
这是显而易见的,因为s作为Son的实例,在Son存在__init__的情况下,Son的__init__肯定会被调用了。
再看下面这个:
#略
class Son(Father):
#def __init__(self):
# print('son')
# print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
def define_model(self):
print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
#略
将最上面程序中的Son类的__init__去掉,那么输出是什么呢?
输出:
father
---Son's __init__ with addr: <__main__.Son instance at 0x7f45b9dc4d88>
This is Son's define_model
s 's addr: <__main__.Son instance at 0x7f45b9dc4d88>
由于Son没有__init__,Father的__init__被调用了,不过,其中的self是指向Son的实例s的
再看一个:
class Father(GrandFather):
#def __init__(self):
# print('father')
# print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
# self.define_model()
def define_model(self):
print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
class Son(Father):
#def __init__(self):
# print('son')
# print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
def define_model(self):
print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
同时把Son和Father的__init__去掉,会输出什么呢?
输出:
grandfather
---Son's __init__ with addr: <__main__.Son instance at 0x7f206982dcb0>
This is Son's define_model
s 's addr: <__main__.Son instance at 0x7f206982dcb0>
GrandFather的__init__被调用了,不过依然,self是指向s的
由此,得出了一个结论(对语言而言,得出结论这种说法仅仅作为记忆用,并不是绝对的,因为语言是人创造的,不是自然存在的):
在继承关系中,缺少__init__的类会调用其血缘关系最近的类的__init__,以此类推。Son没有,就调Father的;Father没有,就调GrandFather的,若GrandFather没有,就什么都没有了(这种情况在本文中就没写了,不过做过实验,可以确认)。