有如下繼承關係:
#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沒有,就什麼都沒有了(這種情況在本文中就沒寫了,不過做過實驗,可以確認)。