導航:首頁 > 編程語言 > python下劃線開始的函數

python下劃線開始的函數

發布時間:2023-03-14 23:38:33

A. python 的類的下劃線命名有什麼不同

1,以一個下劃線開頭的命名 ,如_getFile
2,以兩個下劃線開頭的命名 ,如__filename
3,以兩個下劃線開頭和結尾的命名,如 __init__()
4,其它
這些命名有什麼不同嗎
首先是單下劃線開頭,這個被常用於模塊中,在一個模塊中以單下劃線開頭的變數和函數被默認當作內部函數,如果使用 from a_mole import * 導入時,這部分變數和函數不會被導入。不過值得注意的是,如果使用 import a_mole 這樣導入模塊,仍然可以用 a_mole._some_var 這樣的形式訪問到這樣的對象。

在 Python 的官方推薦的代碼樣式中,還有一種單下劃線結尾的樣式,這在解析時並沒有特別的含義,但通常用於和 Python 關鍵詞區分開來,比如如果我們需要一個變數叫做 class,但 class 是 Python 的關鍵詞,就可以以單下劃線結尾寫作 class_。

雙下劃線開頭的命名形式在 Python 的類成員中使用表示名字改編 (Name Mangling),即如果有一 Test 類里有一成員 __x,那麼 dir(Test) 時會看到 _Test__x 而非 __x。這是為了避免該成員的名稱與子類中的名稱沖突。但要注意這要求該名稱末尾沒有下劃線。

雙下劃線開頭雙下劃線結尾的是一些 Python 的「魔術」對象,如類成員的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推薦永遠不要將這樣的命名方式應用於自己的變數或函數,而是按照文檔說明來使用。

另外單下劃線開頭還有一種一般不會用到的情況在於使用一個 C 編寫的擴展庫有時會用下劃線開頭命名,然後使用一個去掉下劃線的 Python 模塊進行包裝。如 struct 這個模塊實際上是 C 模塊 _struct 的一個 Python 包裝。

更多關於命名的內容可以參考 PEP 8 《代碼風格指南》的 Name Conventions 一節:http://www.python.org/dev/peps/pep-0008/

需要說明的是,由於這份文檔看起來經過多次修改,雙下劃線開頭的用法似乎曾經如 @makestory 所說,建議為類的私有成員,至少啄木鳥社區的 PEP 8 譯文是這樣寫的,但 PEP 8 當前的官方版本中並沒有體現。

B. python下劃線定義屬性

類的私有變數和私有方法

在Python中可以通過在屬性變數名前加上雙下劃線定義屬性為私有屬性

特殊變數命名

1、 _xx 以單下劃線開頭的表示的是protected類型的變數。即保護類型只能允許其本身與子類進行訪問。若內部變數標示,如: 當使用「from M import」時,不會將以一個下劃線開頭的對象引入 。

2、 __xx 雙下劃線的表示的是私有類型的變數。只能允許這個類本身進行訪問了,連子類也不可以用於命名一個類屬性(類變數),調用時名字被改變(在類FooBar內部,__boo變成_FooBar__boo,如self._FooBar__boo)

3、 __xx__定義的是特列方法。用戶控制的命名空間內的變數或是屬性,如init , __import__或是file 。只有當文檔有說明時使用,不要自己定義這類變數。 (就是說這些是python內部定義的變數名)

在這里強調說一下私有變數,python默認的成員函數和成員變數都是公開的,沒有像其他類似語言的public,private等關鍵字修飾.但是可以在變數前面加上兩個下劃線"_",這樣的話函數或變數就變成私有的.這是python的私有變數軋壓(這個翻譯好拗口),英文是(private name mangling.) **情況就是當變數被標記為私有後,在變數的前端插入類名,再類名前添加一個下劃線"_",即形成了_ClassName__變數名.**

Python內置類屬性

__dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

__doc__ :類的文檔字元串

__mole__: 類定義所在的模塊(類的全名是'__main__.className',如果類位於一個導入模塊mymod中,那麼className.__mole__ 等於 mymod)

__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)

C. Python中常見魔法方法介紹

魔法方法 (Magic Methods) 是Python中的內置函數,一般以雙下劃線開頭和結尾,例如__ init__ __del__ 等。之所以稱之為魔法方法,是因為這些方法會在進行特定的操作時會自動被調用。

在Python中,可以通過dir()方法來查看某個對象的所有方法和屬性,其中雙下劃線開頭和結尾的就是該對象的魔法方法。以字元串對象為例:

可以看到字元串對象有 __add__ 方法,所以在Python中可以直接對字元串對象使用"+"操作,當Python識別到"+"操作時,就會調用該對象的 __add__ 方法。有需要時我們可以在自己的類中重寫 __add__ 方法來完成自己想要的效果。

我們重寫了 __add__ 方法,當Python識別"+"操作時,會自動調用重寫後的 __add__ 方法。可以看到,魔法方法在類或對象的某些事件出發後會自動執行,如果希望根據自己的程序定製特殊功能的類,那麼就需要對這些方法進行重寫。使用魔法方法,我們可以非常方便地給類添加特殊的功能。

1、構造與初始化

__ new __ __ init __ 這兩個魔法方法常用於對類的初始化操作。上面我們創建a1 = A("hello")時,但首先調用的是 __ new __ ;初始化一個類分為兩步:

a.調用該類的new方法,返回該類的實例對象

b.調用該類的init方法,對實例對象進行初始化。


__new__ (cls, *args, **kwargs)至少需要一個cls參數,代表傳入的類。後面兩個參數傳遞給 __ init __ 。在 __ new __ 可以決定是否繼續調用 __ init __ 方法,只有當 __ new __ 返回了當前類cls的實例,才會接著調用 __ init __ 。結合 __ new __ 方法的特性,我們可以通過重寫 __ new __ 方法實現Python的單例模式:


可以看到雖然創建了兩個對象,但兩個對象的地址相同。

2、控制屬性訪問這類魔法

方法主要對對象的屬性進行訪問、定義、修改時起作用。主要有:

__getattr__(self, name): 定義當用戶試圖獲取一個屬性時的行為。

__getattribute__(self, name):定義當該類的屬性被訪問時的行為(先調用該方法,查看是否存在該屬性,若不存在,接著去調用getattr)。

__setattr__(self, name, value):定義當一個屬性被設置時的行為。

當初始化屬性時如self.a=a時或修改實例屬性如ins.a=1時本質時調用魔法方法self. __ setattr __ (name,values);當實例訪問某個屬性如ins.a本質是調用魔法方法a. __ getattr __ (name)

3、容器類操作

有一些方法可以讓我們自己定義自己的容器,就像Python內置的List,Tuple,Dict等等;容器分為可變容器和不可變容器。

如果自定義一個不可變容器的話,只能定義__ len__ 和__ getitem__ ;定義一個可變容器除了不可變容器的所有魔法方法,還需要定義__ setitem__ 和__ delitem__ ;如果容器可迭代。還需要定義__ iter __。

__len__(self):返回容器的長度

__getitem__(self,key):當需要執行self[key]的方式去調用容器中的對象,調用的是該方法

__setitem__(self,key,value):當需要執行self[key] = value時,調用的是該方法

__iter__(self):當容器可以執行 for x in container:,或者使用iter(container)時,需要定義該方法


下面舉一個例子,實現一個容器,該容器有List的一般功能,同時增加一些其它功能如訪問第一個元素,最後一個元素,記錄每個元素被訪問的次數等。


這類方法的使用場景主要在你需要定義一個滿足需求的容器類數據結構時會用到,比如可以嘗試自定義實現樹結構、鏈表等數據結構(在collections中均已有),或者項目中需要定製的一些容器類型。

魔法方法在Python代碼中能夠簡化代碼,提高代碼可讀性,在常見的Python第三方庫中可以看到很多對於魔法方法的運用。

因此當前這篇文章僅是拋磚引玉,真正的使用需要在開源的優秀源碼中以及自身的工程實踐中不斷加深理解並合適應用。

D. python中以下劃線開頭的變數名的含義

_xx:前面單個下劃線,私有化屬性或方法,變數不能被外部直接調用
__xx:前面兩條下劃線,私有化屬性或方法,無法在外部直接訪問,只允許類本身調用
__xx__:前後兩條下劃線,系統定義名字,對Python 來說有特殊用途
xx_:後面單條下劃線,用於避免與Python關鍵詞的沖突

E. python中下劃線命名的含義

python中有五種下劃線命名;
(1)單前導下劃線: var
以單個下劃線開頭的變數或方法僅供內部使用,但是不強制執行。通過類名.變數名依然可以引用,但是在使用通配符導入模塊(from 模塊 import *)時,不能調用使用下劃線定義的函數,而常規導入(import 模塊)是可以調用的。
(2)單末尾下劃線:var
當最符合當前函數的變數名被佔用,則可以使用_來解決命名沖突。單個末尾下劃線(後綴)是一個約定,用來避免與Python關鍵字產生命名沖突。
(3)雙前導下劃線:_ var
雙下劃線前綴會導致Python解釋器重寫屬性名稱,以避免子類中的命名沖突。
這也叫做名稱修飾(name mangling) - 解釋器更改變數的名稱,以便在類被擴展的時候不容易產生沖突。
(4)雙前導和末尾下劃線: var
Python保留了有雙前導和雙末尾下劃線的名稱,用於特殊用途。 這樣的例子有, init 對象構造函數,或 call --- 它使得一個對象可以被調用。最好避免在自己的程序中使用以雙下劃線(「nders」)開頭和結尾的名稱,以避免與將來Python語言的變化產生沖突。
(5)單下劃線:
有時候單個獨立下劃線是用作一個名字,來表示某個變數是臨時的或無關緊要的。單個下劃線僅僅是一個有效的變數名稱,會有這個用途而已。
總結:

參考: Python中下劃線的5種含義

F. 【變數】關於單下劃線、雙下劃線開頭變數的含義

以單下劃線(_)表明是標准庫的變數

雙下劃線(__) 開頭表明是編譯器的變數

建議自己在命名的時候不要用下劃線開頭,避免與標准庫中的命名沖突。

Python 用下劃線作為變數前綴和後綴指定特殊變數

_xxx 不能用 「from mole import *」 導入

__xxx__ 系統定義名字

__xxx 類中的私有變數名

核心風格:避免用下劃線作為變數名的開始

因為下劃線對解釋器有特殊的意義,而且是內建標識符所使用的符號,我們建議程序員避免用下劃線作為變數名的開始。

一般來講,變數名_xxx被看作是「私有的」,在模塊或類外不可以使用,當變數是私有的時候,用_xxx 來表示變數是很好的習慣。因為變數名__xxx__對Python 來說有特殊含義,對於普通的變數應當避免這種命名風格。

「單下劃線」 開始的成員變數叫做保護變數,意思是只有類對象和子類對象自己能訪問到這些變數;

「雙下劃線」 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。

以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用「from xxx import *」而導入;

以雙下劃線開頭的(__foo)代表類的私有成員;

以雙下劃線開頭和結尾的(__foo__)代表python里特殊方法專用的標識,如 __init__()代表類的構造函數。

G. Python魔法函數(特殊函數)

Python中如何實現運算符的重載,即實現例如a+b這樣的運算符操作呢?

在C++中可以使用 operator 關鍵字實現運算符的重載。但是在Python中沒有類似這樣的關鍵字,所以要實現運算符的重載,就要用到Python的魔法函數。Python魔法函數是以雙下劃線開頭,雙下劃線結尾的一組函數。我們在類定義中最常用到的 __init__ 函數就是這樣一個魔法函數,它在創建類對象時被自動調用。

下面我們來看個簡單的例子。

上述代碼示例了幾個魔法函數的用法。 __add__ 函數對應了二元運算符+,當執行a+b語句時,python就會自動調用a. add (b)。 對於上述例子中的v1+v2+v3,則相當於調用了(v1. add(v2)). add(v3)。

代碼中還有一個在Python類定義經常使用的 __str__ 函數,當使用 str() 時會被調用。print函數對傳入的參數都調用了str()將其轉換成易讀的字元串形式,便於列印輸出,因而會調用類定義的__str__函數打出自定義的字元串。

代碼中還有一個特殊的 __call__ 函數,該函數在將對象採用函數調用方式使用時被調用, 例如v1()相當於v1. call ()。

以上就是魔法函數的基本使用方法。常見的魔法函數我們可以使用 dir() 函數來查看。

輸出結果為:

上述結果中形式為『__函數名__』的函數為魔法函數,注意有些對象也是這種形式,例如__class__, __mole__等, 這些不是魔法函數。具體的魔法函數說明可以參考Python官方說明文檔。

以上代碼在Python3.6運行通過.

閱讀全文

與python下劃線開始的函數相關的資料

熱點內容
linux解掛 瀏覽:507
新手程序員練習軟體 瀏覽:1
腰椎壓縮性骨折四個月後彎腰疼 瀏覽:211
工作6年程序員面試十幾家都失敗 瀏覽:217
qp16壓縮機 瀏覽:327
itextjsppdf 瀏覽:527
java校驗數字 瀏覽:74
游戲啟動包放哪個文件夾 瀏覽:103
dde源碼編譯 瀏覽:125
可加密視頻的player 瀏覽:939
51單片機外部中斷觸發 瀏覽:818
java字元串編碼格式 瀏覽:584
安卓手機充電線尾插為什麼長 瀏覽:354
我的世界盜版伺服器怎麼建 瀏覽:269
應廣單片機程序 瀏覽:839
河南省網通伺服器雲空間 瀏覽:672
行程碼和健康碼怎麼做成文件夾 瀏覽:996
菜譜pdf下載 瀏覽:581
產品經理與程序員動圖 瀏覽:712
道經pdf 瀏覽:1020