python 繼承中的self和__init__

有如下繼承關係:

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章