成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python中的下劃線(譯文)

rollback / 3110人閱讀

摘要:原文地址這篇文章討論中下劃線的使用。跟中很多用法類似,下劃線的不同用法絕大部分不全是都是一種慣例約定。這種情況,單下劃線經(jīng)常被用作國(guó)際化和本地化字符串翻譯查詢的函數(shù)名。

原文地址
這篇文章討論P(yáng)ython中下劃線_的使用。跟Python中很多用法類似,下劃線_的不同用法絕大部分(不全是)都是一種慣例約定。

單個(gè)下劃線(_

主要有三種情況:

1. 解釋器中

_符號(hào)是指交互解釋器中最后一次執(zhí)行語(yǔ)句的返回結(jié)果。這種用法最初出現(xiàn)在CPython解釋器中,其他解釋器后來(lái)也都跟進(jìn)了。

>>> _
Traceback (most recent call last):
  File "", line 1, in 
NameError: name "_" is not defined
>>> 42
>>> _
42
>>> "alright!" if _ else ":("
"alright!"
>>> _
"alright!"
2. 作為名稱使用

這個(gè)跟上面有點(diǎn)類似。_用作被丟棄的名稱。按照慣例,這樣做可以讓閱讀你代碼的人知道,這是個(gè)不會(huì)被使用的特定名稱。舉個(gè)例子,你可能無(wú)所謂一個(gè)循環(huán)計(jì)數(shù)的值:

n = 42
for _ in range(n):
    do_something()
3. i18n

_還可以被用作函數(shù)名。這種情況,單下劃線經(jīng)常被用作國(guó)際化和本地化字符串翻譯查詢的函數(shù)名。這種慣例好像起源于C語(yǔ)言。舉個(gè)例子,在 Django documentation for translation 中你可能會(huì)看到:

from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)

第二種和第三種用法會(huì)引起沖突,所以在任意代碼塊中,如果使用了_作i18n翻譯查詢函數(shù),就應(yīng)該避免再用作被丟棄的變量名。

單下劃線前綴的名稱(例如_shahriar

以單下劃線做前綴的名稱指定了這個(gè)名稱是“私有的”。在 有些 導(dǎo)入import * 的場(chǎng)景中,下一個(gè)使用你代碼的人(或者你本人)會(huì)明白這個(gè)名稱僅內(nèi)部使用。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.

之所以說(shuō)在在 有些 import * 的場(chǎng)景,是因?yàn)閷?dǎo)入時(shí)解釋器確實(shí)對(duì)單下劃線開頭的名稱做了處理。如果你這么寫from import *,任何以單下劃線開頭的名稱都不會(huì)被導(dǎo)入,除非模塊/包的__all__列表明確包含了這些名稱。更多相關(guān)信息見““Importing * in Python”。

雙下劃線前綴的名稱(例如__shahriar

以雙下劃線做前綴的名稱(特別是方法名)并不是一種慣例;它對(duì)解釋器有特定含義。Python會(huì)改寫這些名稱,以免與子類中定義的名稱產(chǎn)生沖突。Python documentation中提到,任何__spam這種形式(至少以兩個(gè)下劃線做開頭,絕大部分都還有一個(gè)下劃線做結(jié)尾)的標(biāo)識(shí)符,都會(huì)文本上被替換為_classname__spam,其中classname是當(dāng)前類名,并帶上一個(gè)下劃線做前綴。
看下面這個(gè)例子:

>>> class A(object):
...     def _internal_use(self):
...         pass
...     def __method_name(self):
...         pass
... 
>>> dir(A())
["_A__method_name", ..., "_internal_use"]

正如所料,_internal_use沒(méi)有變化,但__method_name被改寫成了_ClassName__method_name?,F(xiàn)在創(chuàng)建一個(gè)A的子類B(這可不是個(gè)好名字),就不會(huì)輕易的覆蓋掉A中的__method_name了:

>>> class B(A):
...     def __method_name(self):
...         pass
... 
>>> dir(B())
["_A__method_name", "_B__method_name", ..., "_internal_use"]

這種特定的行為差不多等價(jià)于Java中的final方法和C++中的正常方法(非虛方法)。

前后都帶有雙下劃線的名稱(例如__init__

這些是Python的特殊方法名,這僅僅是一種慣例,一種確保Python系統(tǒng)中的名稱不會(huì)跟用戶自定義的名稱發(fā)生沖突的方式。通常你可以覆寫這些方法,在Python調(diào)用它們時(shí),產(chǎn)生你想得到的行為。例如,當(dāng)寫一個(gè)類的時(shí)候經(jīng)常會(huì)覆寫__init__方法。
你也可以寫出自己的“特殊方法”名(但是別這么做):

>>> class C(object):
...     def __mine__(self):
...         pass
...
>>> dir(C)
... [..., "__mine__", ...]

還是不要這樣寫方法名,只讓Python定義的特殊方法名使用這種慣例吧。


hackernews和reddit上的相關(guān)討論

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37494.html

相關(guān)文章

  • PSR-4:自動(dòng)加載

    摘要:概述這份聲明了關(guān)于從文件路徑自動(dòng)加載類的規(guī)范。當(dāng)根據(jù)完全限定類名加載對(duì)應(yīng)的文件時(shí)由最開始的命名空間開始,連續(xù)的一個(gè)或多個(gè)命名空間組成的序列,不包括最前面的命名空間分隔符,在這個(gè)完全限定類名中這個(gè)序列稱為命名空間前綴,對(duì)應(yīng)了至少一個(gè)基礎(chǔ)目錄。 PSR-4:自動(dòng)加載 翻譯:薛粲授權(quán)許可:CC BY-NC 4.0 這份文檔是《PSR-4: Autoloader》的非官方譯文。 英文原文使用的...

    ZweiZhao 評(píng)論0 收藏0
  • Python爬蟲學(xué)習(xí)路線

    摘要:以下這些項(xiàng)目,你拿來(lái)學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問(wèn)題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說(shuō)。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過(guò)一遍Python最基本的知識(shí),比如說(shuō):變量、數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法...

    liaoyg8023 評(píng)論0 收藏0
  • 譯文」JavaScript核心

    摘要:在這個(gè)情況下我們可能需要使用構(gòu)造函數(shù),其以指定的模式來(lái)創(chuàng)造對(duì)象。構(gòu)造函數(shù)也有自己的,值為,也通過(guò)其屬性關(guān)聯(lián)到。從邏輯上來(lái)說(shuō),這是以棧的形式實(shí)現(xiàn)的,它叫作執(zhí)行上下文棧。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 對(duì)象 原型鏈 構(gòu)造函數(shù) 執(zhí)行上下文棧 執(zhí)行上下文 變量對(duì)象 活動(dòng)對(duì)象 作用域鏈 閉包 Thi...

    高璐 評(píng)論0 收藏0
  • 【譯】Python的優(yōu)雅技巧

    摘要:你可以進(jìn)行如下操作需要注意的是這個(gè)竅門只適用于。在中就不需要進(jìn)行操作了,因?yàn)樗呀?jīng)默認(rèn)進(jìn)行了。這里有幾個(gè)例子可以供你參考譯文出處本文根據(jù)的所譯,整個(gè)譯文帶有我自己的理解與思想,如果譯得不好或有不對(duì)之處還請(qǐng)同行朋友指點(diǎn)。 枚舉 不要這么做: i = 0 for item in iterable: print i, item i += 1 而是這樣: for...

    legendaryedu 評(píng)論0 收藏0
  • 如何自定義Flask中的響應(yīng)類(譯文

    摘要:在使用自定義響應(yīng)類的應(yīng)用中,和無(wú)法知道自定義類的細(xì)節(jié),所以它們使用標(biāo)準(zhǔn)響應(yīng)類來(lái)創(chuàng)建響應(yīng)。有了這個(gè)自定義響應(yīng)類,任何滿足格式要求的文檔都會(huì)自動(dòng)被標(biāo)記為內(nèi)容類型,而其他響應(yīng)則會(huì)繼續(xù)獲得默認(rèn)的內(nèi)容類型。 譯文鏈接:編程派 原文鏈接:Flask Web Development作者的博客 有翻譯或理解不對(duì)的地方,望大家指正! Flask框架中的響應(yīng)類,命名很貼切,叫Response。不過(guò)...

    ruicbAndroid 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<