我想明白,當我們在Python中實例的子類,例如創建什麼樣的對象:通過調用這個類的構造函數Python的超級(),究竟發生了什麼?
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
當我們創建對象my_tesla,我們實例化類ElectricCar,它依次調用父項的構造函數。它是如何發生的?現在我有兩個猜測:
1)super()只是對父類的引用,所以我們通過「super()」調用父類的構造函數init(make,model,year)「實例化我們的子類。因此,我們只有我們類ElectricCar()的一個對象。 2)super(),調用父類的構造函數,創建「Car」類的對象,然後通過「super()」調用該對象的構造函數。年)」。因此,我們有兩個對象:類Car()的一個對象和ElectiricCar類的一個對象,在我們的例子中它們是相同的。
哪一個是正確的? 如果沒有,那麼請解釋一下到底發生了什麼的:
super().__init__(make, model, year)
沒有。你仍然只有一個物體,一個'ElectricCar'。構造函數與其他任何函數一樣。它不會爲你「創建」一個對象 - 在執行構造函數時,該對象已經由底層運行時創建。構造函數只是在那裏初始化那個新的對象。所以調用super().__ init__只是運行一個普通的對象方法。該方法是構造函數的事實是無關緊要的。只有當它由對象構建器自動執行時纔是構造器。 –
http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods – jbat100