2017-04-03 33 views
1

您好,我對通過Python的類中的方法__init__方法有疑問。人們會說這是類實例正在作爲__init__方法中的第一個參數在這裏傳遞。Python中類的__init__方法中的self是什麼?

Class A(): 

    def __init__(self): 
     pass 

    def check(self): 
     pass 

a = A() 
a.check() 

因爲我們理解,此處「A」爲被傳遞的第一個參數的方法__init__。但是在這裏我們剛剛創建了類A的實例。至於其他方法檢查,當我們要做a.check()時,會理解好,我們在這裏調用一個類的實例來調用,以便它被傳遞。但對於__init__方法,我們沒有做任何事情,只是創建了實例。那麼它是如何通過的。

舉一個例子, a = a + 10 ...直到這個表達式纔開始初始化。與__init__一樣。

我們剛剛在這裏創建了實例a = A()。那麼會通過這裏。

我知道我的問題有點棘手。但是這個問題在我的採訪中被問到了。

請有人可以幫忙嗎?

+0

除'__new__'被覆蓋(或使用元類),禁用此行爲。構造對象時,__init__'總是被**調用。它像一個*構造函數*(就像在Java中一樣)。 –

+0

hi @WillemVanOnsem ..感謝您的回答,我知道這是與java相同的構造函數。但我的問題有點不同。喜歡瞭解自我如何作爲第一個參數被傳遞,如果我們沒有用這個參數來調用這個方法。 – Anendra

回答

6

不會a會通過,類實例通過。該實例在分配給a之前已存在。它獨立存在於a。就拿:

[A() for _ in range(5)] 

會有的創建A 5分的情況下,即使他們不直接分配給任何變量(列表中的表達可以被分配,但每一個人A()不是)。

當實例化一個類,這個類的__new__創建新實例,然後調用它__init__,那麼新的實例返回和(你的情況)分配給a(用於更深入的細節見https://stackoverflow.com/a/43187010/476)。

+0

我也會提及'__new__',它有助於理解'__init__'的真正作用。好工作 – sadmicrowave

+0

感謝您的解釋。 @deceze。合理。 – Anendra

5

的步驟的順序(假設標準元類type)在這個例子中是

  1. A()使用type.__call__(A)被實現。
  2. type.__call__(A)來電A.__new__
  3. A.__new__解析爲object.__new__,返回A的新實例。
  4. type.__call__(A)將返回值object.__new__傳遞給A.__init__(其中self是用於__init__的第一個參數的名稱)。
  5. type.__call__(A)然後返回(名稱爲a)的(初始化)對象。
+0

感謝您的解釋。 – Anendra

相關問題