摘要:原文地址這篇文章討論中下劃線的使用。跟中很多用法類似,下劃線的不同用法絕大部分不全是都是一種慣例約定。這種情況,單下劃線經常被用作國際化和本地化字符串翻譯查詢的函數名。
原文地址
這篇文章討論Python中下劃線_的使用。跟Python中很多用法類似,下劃線_的不同用法絕大部分(不全是)都是一種慣例約定。
主要有三種情況:
1. 解釋器中_符號是指交互解釋器中最后一次執行語句的返回結果。這種用法最初出現在CPython解釋器中,其他解釋器后來也都跟進了。
>>> _ Traceback (most recent call last): File "", line 1, in NameError: name "_" is not defined >>> 42 >>> _ 42 >>> "alright!" if _ else ":(" "alright!" >>> _ "alright!"2. 作為名稱使用
這個跟上面有點類似。_用作被丟棄的名稱。按照慣例,這樣做可以讓閱讀你代碼的人知道,這是個不會被使用的特定名稱。舉個例子,你可能無所謂一個循環計數的值:
n = 42 for _ in range(n): do_something()3. i18n
_還可以被用作函數名。這種情況,單下劃線經常被用作國際化和本地化字符串翻譯查詢的函數名。這種慣例好像起源于C語言。舉個例子,在 Django documentation for translation 中你可能會看到:
from django.utils.translation import ugettext as _ from django.http import HttpResponse def my_view(request): output = _("Welcome to my site.") return HttpResponse(output)
第二種和第三種用法會引起沖突,所以在任意代碼塊中,如果使用了_作i18n翻譯查詢函數,就應該避免再用作被丟棄的變量名。
單下劃線前綴的名稱(例如_shahriar)以單下劃線做前綴的名稱指定了這個名稱是“私有的”。在 有些 導入import * 的場景中,下一個使用你代碼的人(或者你本人)會明白這個名稱僅內部使用。Python documentation里面寫道:
a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
之所以說在在 有些 import * 的場景,是因為導入時解釋器確實對單下劃線開頭的名稱做了處理。如果你這么寫from
以雙下劃線做前綴的名稱(特別是方法名)并不是一種慣例;它對解釋器有特定含義。Python會改寫這些名稱,以免與子類中定義的名稱產生沖突。Python documentation中提到,任何__spam這種形式(至少以兩個下劃線做開頭,絕大部分都還有一個下劃線做結尾)的標識符,都會文本上被替換為_classname__spam,其中classname是當前類名,并帶上一個下劃線做前綴。
看下面這個例子:
>>> class A(object): ... def _internal_use(self): ... pass ... def __method_name(self): ... pass ... >>> dir(A()) ["_A__method_name", ..., "_internal_use"]
正如所料,_internal_use沒有變化,但__method_name被改寫成了_ClassName__method_name。現在創建一個A的子類B(這可不是個好名字),就不會輕易的覆蓋掉A中的__method_name了:
>>> class B(A): ... def __method_name(self): ... pass ... >>> dir(B()) ["_A__method_name", "_B__method_name", ..., "_internal_use"]
這種特定的行為差不多等價于Java中的final方法和C++中的正常方法(非虛方法)。
前后都帶有雙下劃線的名稱(例如__init__)這些是Python的特殊方法名,這僅僅是一種慣例,一種確保Python系統中的名稱不會跟用戶自定義的名稱發生沖突的方式。通常你可以覆寫這些方法,在Python調用它們時,產生你想得到的行為。例如,當寫一個類的時候經常會覆寫__init__方法。
你也可以寫出自己的“特殊方法”名(但是別這么做):
>>> class C(object): ... def __mine__(self): ... pass ... >>> dir(C) ... [..., "__mine__", ...]
還是不要這樣寫方法名,只讓Python定義的特殊方法名使用這種慣例吧。
hackernews和reddit上的相關討論
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37494.html
摘要:概述這份聲明了關于從文件路徑自動加載類的規范。當根據完全限定類名加載對應的文件時由最開始的命名空間開始,連續的一個或多個命名空間組成的序列,不包括最前面的命名空間分隔符,在這個完全限定類名中這個序列稱為命名空間前綴,對應了至少一個基礎目錄。 PSR-4:自動加載 翻譯:薛粲授權許可:CC BY-NC 4.0 這份文檔是《PSR-4: Autoloader》的非官方譯文。 英文原文使用的...
摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數據結構、語法...
摘要:在這個情況下我們可能需要使用構造函數,其以指定的模式來創造對象。構造函數也有自己的,值為,也通過其屬性關聯到。從邏輯上來說,這是以棧的形式實現的,它叫作執行上下文棧。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 對象 原型鏈 構造函數 執行上下文棧 執行上下文 變量對象 活動對象 作用域鏈 閉包 Thi...
摘要:你可以進行如下操作需要注意的是這個竅門只適用于。在中就不需要進行操作了,因為它已經默認進行了。這里有幾個例子可以供你參考譯文出處本文根據的所譯,整個譯文帶有我自己的理解與思想,如果譯得不好或有不對之處還請同行朋友指點。 枚舉 不要這么做: i = 0 for item in iterable: print i, item i += 1 而是這樣: for...
摘要:在使用自定義響應類的應用中,和無法知道自定義類的細節,所以它們使用標準響應類來創建響應。有了這個自定義響應類,任何滿足格式要求的文檔都會自動被標記為內容類型,而其他響應則會繼續獲得默認的內容類型。 譯文鏈接:編程派 原文鏈接:Flask Web Development作者的博客 有翻譯或理解不對的地方,望大家指正! Flask框架中的響應類,命名很貼切,叫Response。不過...
閱讀 2986·2020-01-08 12:17
閱讀 1991·2019-08-30 15:54
閱讀 1152·2019-08-30 15:52
閱讀 2033·2019-08-29 17:18
閱讀 1042·2019-08-29 15:34
閱讀 2460·2019-08-27 10:58
閱讀 1861·2019-08-26 12:24
閱讀 368·2019-08-23 18:23