回答
添加一個答案,因爲Oskarbi的不明確。
您使用self
時:
- 定義一個實例方法。當您在實例上調用方法時,它會自動作爲第一個參數傳遞,並且它是調用方法的實例。
- 在實例方法內引用類或實例屬性。使用它你想調用一個方法,或者在該方法內部調用該方法的實例上訪問一個名稱(變量)。
時
- 你調用一個實例方法通常你不使用
self
。以奧斯卡比爲例,如果你做instance = MyClass()
,你可以撥打MyClass.my_method
作爲instance.my_method(some_var)
而不是instance.my_method(self, some_var)
。 - 您引用以外的類屬性實例方法,但在類定義中。
- 你在staticmethod之內。
這些不應該是什麼時候不使用自我的例子。 DOS是當你應該使用它。
對於實例變量和方法,它是強制性的隨時使用自己。
使用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...
有什麼 '特別' 這個名字
self
。這是Pythonistas慣用的名稱,用於指示該參數預期包含的內容。當您調用實例的實例方法時,無論您是否故意提供,Python運行時都會傳遞一個「自我」值。這通常會導致一個易於診斷/理解的錯誤(因爲該函數將被調用的參數數量錯誤),但使用
*args
會導致更奇怪的類型錯誤。當您在實例上調用實例方法時,該參數將隱式傳遞。它包含您調用該方法的實例。所以你不要在函數調用中提到
self
,因爲(a)如上所述,這沒有任何意義(一般而言,範圍內不存在self
,並且self
不是關鍵字或特殊名稱或任何東西); (b)您已經指示要使用的實例(通過編寫my_instance.
)。您當然可以通過從類中訪問它來顯式調用實例方法。在這種情況下,您需要顯式傳遞實例作爲第一個參數。你一般來說不想這樣做。而且你不想編寫代碼,認爲第一個參數是以這種方式顯式傳遞的其他東西的可能性。這類似於在C++中檢查
if (this == null)
:你不這樣做,因爲如果它可能意味着什麼,那麼調用代碼是錯誤,道德上,如果不合法。 (至少在Python中,您不會遇到未定義行爲的問題,但它在道德上仍然是錯誤的。)在實例方法中,因爲
self
是一個已將實例賦值爲值的參數,所以您可以編寫self.whatever
來訪問實例的屬性。與其他一些'隱式this
'風格語言不同,屬性名稱是而不是隱含地「在範圍內」。self
沒有其他用例,因爲它不是一個特殊的名稱,這是命名約定所指定的一個特定目的。如果您需要從另一個模塊訪問「變量」(真正的屬性),則可以使用模塊名稱。如果您想從當前模塊訪問一個模塊,則不需要前綴,或者真的有可能發生這種情況。 (嗯,你可以明確看它由globals()
返回dict
,但請不要這麼做。)
- 1. 什麼時候在Python中使用關鍵字「self」
- 2. 什麼時候我們不應該使用[weak self]和[unowned self]?
- 3. 你什麼時候在Python中使用線程?
- 4. 什麼時候應該在C庫的Rust綁定中使用`&mut self`與`&self`?
- 5. 什麼是SELF JOIN,什麼時候使用它?
- 6. 你什麼時候使用新方法?
- 7. 你什麼時候使用jqGrid no_legacy_api = false?
- 8. Symfony sfFormFilters - 你什麼時候使用它?
- 9. 你什麼時候使用getGraphObject和getGraphEdge
- 10. 你什麼時候可以使用uint_least16_t
- 11. 你什麼時候使用std :: unordered_map :: emplace_hint?
- 12. 你什麼時候使用mmap
- 13. 你怎麼知道什麼時候在Python中關閉文件?
- 14. 你什麼時候使用實例? Python 3
- 15. 什麼時候你把Javascript放在body裏,什麼時候在頭,什麼時候用doc.load?
- 16. 什麼時候使用self,parent,static和how?
- 17. 什麼時候應該使用「self」關鍵字?
- 18. 什麼時候你會在Swift中使用 - >()?
- 19. 你什麼時候在C#中使用代表?
- 20. 在Java中,你什麼時候使用const而不是final?
- 21. 什麼時候你必須在iPhone SDK中使用@property和@synthesize?
- 22. 什麼時候你會在PHP中使用$ this關鍵字?
- 23. 什麼時候你返回一個類,你什麼時候返回一個HttpResponseMessage?
- 24. 你什麼時候會用attr_writer?
- 25. 什麼是Ninject,你什麼時候使用它?
- 26. 在TypeScript中,什麼時候使用「let」,什麼時候使用「const」?
- 27. 什麼時候使用for-each和什麼時候在xslt中使用apply-templates?
- 28. 什麼時候使用__proto__和什麼時候使用原型
- 29. 什麼時候應該使用AWS,什麼時候不使用
- 30. intn_t什麼時候使用它,什麼時候不使用
所以當有疑問,總是去了? –
是的!這是強制性的。 – lc2817
@DarkTemplar當_defining_實例方法,或者在實例方法中調用一個或引用一個實例變量時,您總是使用self,否則不會。我不知道他「隨時」想要什麼,但從字面上看並不是真的。 – agf