最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中單、雙下劃線的區(qū)別總結(jié)

 更新時(shí)間:2017年12月01日 10:17:20   作者:時(shí)間軌跡  
這篇文章主要給大家介紹了關(guān)于Python中單、雙下劃線區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

Python 的代碼風(fēng)格由 PEP 8 描述。這個(gè)文檔描述了 Python 編程風(fēng)格的方方面面。在遵守這個(gè)文檔的條件下,不同程序員編寫的 Python 代碼可以保持最大程度的相似風(fēng)格。這樣就易于閱讀,易于在程序員之間交流。

我們大家在學(xué)習(xí)Python的時(shí)候,好像很多人都不理解為什么在方法(method)前面會(huì)加好幾個(gè)下劃線,有時(shí)甚至兩邊都會(huì)加,比如像__this__這種。在我看到上面的文章之前,我一直以為Python中這些下劃線的作用就像Golang中方法/函數(shù)的大小寫一樣,或是一些其他語(yǔ)言中的private、public的作用一樣,但仔細(xì)深究,這不全是Python這樣設(shè)計(jì)的初衷。

下面我們具體分析,話不多說(shuō)了,來(lái)一起看看吧。

單下劃線開(kāi)頭

我們經(jīng)??吹椒椒ɑ蛘邔傩郧懊婕恿藛蜗聞澗€,并認(rèn)為它表示該方法或者屬性是該類型(Python和Golang一樣,不光類可以有方法,很多類型甚至基本類型也可以定義方法)的私有方法或?qū)傩浴5鋵?shí)在Python中不存在真正意義上的私有方法或者屬性,前面加單下劃線_只是表示你不應(yīng)該去訪問(wèn)這個(gè)方法或者屬性,因?yàn)樗皇茿PI的一部分。

舉個(gè)例子:

Python
class BaseForm(StrAndUnicode):
 ...

 def _get_errors(self):
 "Returns an ErrorDict for the data provided for the form"
 if self._errors is None:
 self.full_clean()
 return self._errors

 errors = property(_get_errors)

該代碼片段來(lái)自Django源碼(django/forms/forms.py)。這段代碼的設(shè)計(jì)就是errors屬性是對(duì)外API的一部分,如果你想獲取錯(cuò)誤詳情,應(yīng)該訪問(wèn)errors屬性,而不是(也不應(yīng)該)訪問(wèn)_get_errors方法。

雙下劃線開(kāi)頭

之前很多人跟我說(shuō)Python中雙下劃線開(kāi)頭表示私有,我在很多地方也見(jiàn)到這樣的說(shuō)法。這樣理解可能也不能說(shuō)錯(cuò),但這不是Python設(shè)計(jì)雙下劃線開(kāi)頭的初衷和目的,Python設(shè)計(jì)此的真正目的僅僅是為了避免子類覆蓋父類的方法。

我們看個(gè)例子:

class A(object):
 
 def __method(self):
 print("I'm a method in class A")

 def method_x(self):
 print("I'm another method in class A\n")

 def method(self):
 self.__method()
 self.method_x()

class B(A):
 
 def __method(self):
 print("I'm a method in class B")

 def method_x(self):
 print("I'm another method in class B\n")


if __name__ == '__main__':
 
 print("situation 1:")
 a = A()
 a.method()

 b = B()
 b.method()

 print("situation 2:")
 # a.__method()
 a._A__method() 

執(zhí)行結(jié)果:

situation 1:
I'm a method in class A
I'm another method in class A

I'm a method in class A
I'm another method in class B

situation 2:
I'm a method in class A

這里有兩個(gè)點(diǎn)需要注意:

A類中我們定義了__method()、method_x和method()三個(gè)方法;然后我們重新定義一個(gè)類B,繼承自A,并且在B類中覆寫(override)了其父類的__method()和method_x方法,但是從輸出結(jié)果看,B對(duì)象調(diào)用method()方法時(shí)調(diào)用了其父類A的__method()方法和自己的method_x()方法。也就是說(shuō),__method()覆寫沒(méi)有生效,而method_x()覆寫生效了。而這也正是Python設(shè)計(jì)雙下劃線開(kāi)頭的唯一目的。

這一點(diǎn)也可在Python官方說(shuō)明中得到答案:https://www.python.org/dev/peps/pep-0008/#method-names-and-instance-variables。

前面我們就說(shuō)了,Python中不存在真正意義上的私有變量。對(duì)于雙下劃線開(kāi)頭的方法和屬性雖然我們不能直接引用,那是因?yàn)镻ython默認(rèn)在其前面加了前綴_類名,所以就像situation 2下面的代碼,雖然我們不能用a直接訪問(wèn)__method(),但卻可以加上前綴去訪問(wèn),即_A__method()。

開(kāi)頭結(jié)尾雙下劃線

一般來(lái)說(shuō)像__this__這種開(kāi)頭結(jié)尾都加雙下劃線的方法表示這是Python自己調(diào)用的,你不要調(diào)用。比如我們可以調(diào)用len()函數(shù)來(lái)求長(zhǎng)度,其實(shí)它后臺(tái)是調(diào)用了__len__()方法。一般我們應(yīng)該使用len,而不是直接使用__len__():

a = [1, 2, 3]
print(len(a)) 
print(a.__len__()) # 和上面等效

num = 10
print(num + 10)
print(num.__add__(10)) # 和上面等效

我們一般稱__len__()這種方法為magic methods,一些操作符后臺(tái)調(diào)用的也是也是這些magic methods,比如+后臺(tái)調(diào)用的是__add__,-調(diào)用的是__sub__,所以這種機(jī)制使得我們可以在自己的類中覆寫操作符(見(jiàn)后面例子)。另外,有的時(shí)候這種開(kāi)頭結(jié)尾雙下劃線方法僅僅是某些特殊場(chǎng)景的回調(diào)函數(shù),比如__init__()會(huì)在對(duì)象的初始化時(shí)調(diào)用,__new__()會(huì)在構(gòu)建一個(gè)實(shí)例的時(shí)候調(diào)用等等。下面我們看兩個(gè)例子:

class CrazyNumber(object):
 def __init__(self, n): 
 self.n = n 
 def __add__(self, other): 
 return self.n - other 
 def __sub__(self, other): 
 return self.n + other 
 def __str__(self): 
 return str(self.n) 

num = CrazyNumber(10) 
print(num) # output is: 10
print(num + 5) # output is: 5
print(num - 20) # output is: 30

在上面這個(gè)例子中,我們覆寫了+和-操作符,將他們的功能交換了。再看個(gè)例子:

class Room(object):
 def __init__(self): 
 self.people = [] 
 def add(self, person): 
 self.people.append(person) 
 def __len__(self): 
 return len(self.people)
 
room = Room() 
room.add("Igor") 
print len(room) # output is: 1

這個(gè)例子中,因?yàn)槲覀儗?shí)現(xiàn)了__len__(),所以Room對(duì)象也可以使用len函數(shù)了。

所有此類的方法都在這里有說(shuō)明:documentation.

結(jié)論

  • 使用單下劃線(_one_underline)開(kāi)頭表示方法不是API的一部分,不要直接訪問(wèn)(雖然語(yǔ)法上訪問(wèn)也沒(méi)有什么問(wèn)題)。
  • 使用雙下劃線開(kāi)頭(__two_underlines)開(kāi)頭表示子類不能覆寫該方法。除非你真的知道你在干什么,否則不要使用這種方式。
  • 當(dāng)你想讓自己定義的對(duì)象也可以像Python內(nèi)置的對(duì)象一樣使用Python內(nèi)置的一些函數(shù)或操作符(比如len、add、+、-、==等)時(shí),你可以定義該類方法。
  • 當(dāng)然還有些屬性只在末尾加了但下劃線,這僅僅是為了避免我們起的一些名字和Python保留關(guān)鍵字沖突,沒(méi)有特殊含義。

注:本文大部分內(nèi)容參考自Difference between _ , and __xx in Python .

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步)

    scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步)

    這篇文章主要介紹了scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Python 使用matplotlib模塊模擬擲骰子

    Python 使用matplotlib模塊模擬擲骰子

    這篇文章主要介紹了Python 使用matplotlib模塊模擬擲骰子,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python 轉(zhuǎn)義字符詳細(xì)介紹

    Python 轉(zhuǎn)義字符詳細(xì)介紹

    這篇文章主要介紹了Python 轉(zhuǎn)義字符詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 利用Python實(shí)現(xiàn)可回滾方案的示例代碼

    利用Python實(shí)現(xiàn)可回滾方案的示例代碼

    很多項(xiàng)目翻車不是因?yàn)椴粫?huì)做,而是走錯(cuò)了方向卻沒(méi)法回頭,技術(shù)選型失敗的風(fēng)險(xiǎn)我們都清楚,但真正能提前規(guī)劃“回滾方案”的人不多,本文從實(shí)際項(xiàng)目出發(fā),教你如何用 Python 構(gòu)建一套“可回退、可灰度、可對(duì)比”的技術(shù)架構(gòu)方案,附帶完整 Demo,需要的朋友可以參考下
    2025-05-05
  • 深入理解Python中解包錯(cuò)誤的解決方案

    深入理解Python中解包錯(cuò)誤的解決方案

    在 Python 編程中,解包(Unpacking)是一種強(qiáng)大而常用的特性,它允許我們將可迭代對(duì)象的元素分配給多個(gè)變量,但有時(shí)會(huì)報(bào)錯(cuò),下面我們就來(lái)看看錯(cuò)誤的成因以及相應(yīng)的解決方案吧
    2026-02-02
  • numpy:找到指定元素的索引示例

    numpy:找到指定元素的索引示例

    今天小編就為大家分享一篇numpy:找到指定元素的索引示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Django用內(nèi)置方法實(shí)現(xiàn)簡(jiǎn)單搜索功能的方法

    Django用內(nèi)置方法實(shí)現(xiàn)簡(jiǎn)單搜索功能的方法

    這篇文章主要介紹了Django用內(nèi)置方法實(shí)現(xiàn)簡(jiǎn)單搜索功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • python網(wǎng)絡(luò)爬蟲(chóng)selenium打開(kāi)多窗口與切換頁(yè)面的實(shí)現(xiàn)

    python網(wǎng)絡(luò)爬蟲(chóng)selenium打開(kāi)多窗口與切換頁(yè)面的實(shí)現(xiàn)

    本文主要介紹了python網(wǎng)絡(luò)爬蟲(chóng)selenium打開(kāi)多窗口與切換頁(yè)面的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python導(dǎo)入SciPy的io模塊使用

    python導(dǎo)入SciPy的io模塊使用

    SciPy是一個(gè)強(qiáng)大的科學(xué)計(jì)算庫(kù),本文就就來(lái)介紹了python導(dǎo)入SciPy的io模塊使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • python暴力解壓rar加密文件過(guò)程詳解

    python暴力解壓rar加密文件過(guò)程詳解

    這篇文章主要介紹了python解壓rar加密文件過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

西丰县| 阳高县| 通海县| 酒泉市| 白河县| 石渠县| 谢通门县| 普洱| 资兴市| 甘肃省| 庄河市| 洛宁县| 高州市| 阿瓦提县| 恩施市| 普安县| 庆安县| 四会市| 南投市| 玉屏| 延吉市| 成武县| 重庆市| 达孜县| 刚察县| 临桂县| 渑池县| 灵寿县| 曲麻莱县| 青川县| 汝南县| 新巴尔虎右旗| 花莲市| 观塘区| 陆河县| 资溪县| 扬中市| 嘉鱼县| 泾阳县| 禹州市| 辛集市|