2011-10-11 47 views

回答

20

添加一個答案,因爲Oskarbi的不明確。

您使用self時:

  1. 定義一個實例方法。當您在實例上調用方法時,它會自動作爲第一個參數傳遞,並且它是調用方法的實例。
  2. 在實例方法內引用類或實例屬性。使用它你想調用一個方法,或者在該方法內部調用該方法的實例上訪問一個名稱(變量)。

  1. 你調用一個實例方法通常你使用self。以奧斯卡比爲例,如果你做instance = MyClass(),你可以撥打MyClass.my_method作爲instance.my_method(some_var)而不是instance.my_method(self, some_var)
  2. 您引用以外的類屬性實例方法,但在類定義中。
  3. 你在staticmethod之內。

這些不應該是什麼時候不使用自我的例子。 DOS是當你應該使用它。

1

對於實例變量和方法,它是強制性的隨時使用自己。

+0

所以當有疑問,總是去了? –

+0

是的!這是強制性的。 – lc2817

+0

@DarkTemplar當_defining_實例方法,或者在實例方法中調用一個或引用一個實例變量時,您總是使用self,否則不會。我不知道他「隨時」想要什麼,但從字面上看並不是真的。 – agf

11

使用self來引用來自其他實例方法的實例變量和方法。還要將self作爲實例方法定義中的第一個參數。

一個例子:

class MyClass(object): 

    my_var = None 

    def my_method(self, my_var): 
     self.my_var = my_var 
     self.my_other_method() 

    def my_other_method(self): 
     # do something... 
+0

那麼「class MyClass(object)」是一個構造函數嗎?我發現'object'是一個參數,但不知道這意味着什麼...... –

+0

@DarkTemplar類定義中的參數是基類(也有一個關鍵字參數,'metaclass'用於在Python 3中設置類的類型) – agf

+0

這不是一個構造函數,而是類的定義。正如@agf所說,「object」只是基類。當你實例化這個類時,你不必傳遞任何參數(除非你指定了一個帶有更多參數的'__init __(self)'方法)。 – Oskarbi

3
  1. 什麼 '特別' 這個名字self。這是Pythonistas慣用的名稱,用於指示該參數預期包含的內容。

  2. 當您調用實例的實例方法時,無論您是否故意提供,Python運行時都會傳遞一個「自我」值。這通常會導致一個易於診斷/理解的錯誤(因爲該函數將被調用的參數數量錯誤),但使用*args會導致更奇怪的類型錯誤。

  3. 當您在實例上調用實例方法時,該參數將隱式傳遞。它包含您調用該方法的實例。所以你不要在函數調用中提到self,因爲(a)如上所述,這沒有任何意義(一般而言,範圍內不存在self,並且self不是關鍵字或特殊名稱或任何東西); (b)您已經指示要使用的實例(通過編寫my_instance.)。

  4. 您當然可以通過從類中訪問它來顯式調用實例方法。在這種情況下,您需要顯式傳遞實例作爲第一個參數。你一般來說不想這樣做。而且你不想編寫代碼,認爲第一個參數是以這種方式顯式傳遞的其他東西的可能性。這類似於在C++中檢查if (this == null):你不這樣做,因爲如果它可能意味着什麼,那麼調用代碼是錯誤,道德上,如果不合法。 (至少在Python中,您不會遇到未定義行爲的問題,但它在道德上仍然是錯誤的。)

  5. 在實例方法中,因爲self是一個已將實例賦值爲值的參數,所以您可以編寫self.whatever來訪問實例的屬性。與其他一些'隱式this'風格語言不同,屬性名稱是而不是隱含地「在範圍內」。

  6. self沒有其他用例,因爲它不是一個特殊的名稱,這是命名約定所指定的一個特定目的。如果您需要從另一個模塊訪問「變量」(真正的屬性),則可以使用模塊名稱。如果您想從當前模塊訪問一個模塊,則不需要前綴,或者真的有可能發生這種情況。 (嗯,你可以明確看它由globals()返回dict,但請不要這麼做。)

相關問題