python中的下劃線

本文介紹了Python中單下劃線和雙下劃線的5種表現形式,以及一些使用方法。其中有一些含義僅僅是依照約定,被視作是對程序員的提示,而有一些含義是由Python解釋器嚴格執行的。

  • 單前導下劃線:_var
  • 單末尾下劃線:var_
  • 雙前導下劃線:__var
  • 雙前導和末尾下劃線:__var__
  • 單下劃線:_

1.單前導下劃線 _var

下劃線前綴的含義是告知其他程序員:以單個下劃線開頭的變量或方法僅供內部使用。
該約定在PEP 8中有定義。這不是Python強制規定的。而是一個約定俗成的含義。 它是對程序員的一個提示,意味著Python社區一致認為它應該是什么意思,但程序的行為不受影響。
例子:

class Test:def __init__(self):self.foo = 11self._bar = 23

實例化此類,并嘗試訪問在__init__構造函數中定義的foo和_bar屬性,會發生什么情況?

>>> t = Test()
>>> t.foo
11
>>> t._bar
23

你會看到_bar中的單個下劃線并沒有阻止我們“進入”類并訪問該變量的值。這是因為Python中的單個下劃線前綴僅僅是一個約定。
但是,如果使用通配符從模塊中導入所有名稱,則Python不會導入帶有前導下劃線的名稱。

>>> from my_module import *
>>> external_func()
23
>>> _internal_func()
NameError: "name '_internal_func' is not defined"

2. 單末尾下劃線 var_

有時候,一個變量的最合適的名稱已經被一個關鍵字所占用。 因此,像class或def這樣的名稱不能用作Python中的變量名稱。 在這種情況下,你可以附加一個下劃線來解決命名沖突:

>>> def make_object(name, class):
SyntaxError: "invalid syntax">>> def make_object(name, class_):
...    pass

總之,單個末尾下劃線(后綴)是一個約定,用來避免與Python關鍵字產生命名沖突。 PEP 8解釋了這個約定。

3. 雙前導下劃線 __var

①名稱改寫
雙下劃線還可用于名稱改寫,即將屬性或方法前面的雙下劃線和類名組合起來,以防止子類意外覆蓋父類的屬性或方法。

class Test:def __init__(self):self.foo = 11self._bar = 23self.__baz = 23

讓我們用內置的dir()函數來看看這個對象的屬性:

>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']

以上是這個對象屬性的列表。 讓我們來看看這個列表,并尋找我們的原始變量名稱foo,_bar和__baz ,我保證你會注意到一些有趣的變化。

self.foo變量在屬性列表中顯示為未修改為foo。
self._bar的行為方式相同 - 它以_bar的形式顯示在類上。 就像我之前說過的,在這種情況下,前導下劃線僅僅是一個約定。 給程序員一個提示而已。
然而,對于self.__baz而言,情況看起來有點不同。 當你在該列表中搜索__baz時,你會看不到有這個名字的變量。

__baz出什么情況了?

如果你仔細觀察,你會看到此對象上有一個名為_Test__baz的屬性。 這就是Python解釋器所做的名稱修飾。 它這樣做是為了防止變量在子類中被重寫。

②名稱修飾
雙下劃線用于名稱修飾,即將屬性或方法前面的雙下劃線作為前綴,使其成為私有成員。私有成員只能在類內部訪問,無法在類外部直接訪問

class ManglingTest:def __init__(self):self.__mangled = 'hello'def get_mangled(self):return self.__mangled>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: "'ManglingTest' object has no attribute '__mangled'"

4. 雙前導和雙末尾下劃線__var__

以雙下劃線開頭結尾的變量不會被python解釋器修改。
以雙下劃線開頭結尾的方法在python中稱為魔法方法。這樣的例子有,__init__對象構造函數,或__call__ ,它使得一個對象可以被調用。
為了避免與將來Python語言的變化產生沖突,我應該避免使用雙下劃線開頭和結尾的名稱。

5.單下劃線 _

按照習慣,有時候單個獨立下劃線是用作一個名字,來表示某個變量是臨時的或無關緊要的。

例如,在下面的循環中,我們不需要訪問正在運行的索引,我們可以使用“_”來表示它只是一個臨時值:

>>> for _ in range(32):
...    print('Hello, World.')

你也可以在拆分(unpacking)表達式中將單個下劃線用作“不關心的”變量,以忽略特定的值。 同樣,這個含義只是“依照約定”,并不會在Python解釋器中觸發特殊的行為。 單個下劃線僅僅是一個有效的變量名稱,會有這個用途而已。

>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car>>> color
'red'
>>> mileage
3812.4
>>> _
12

6.總結

模式格式含義
單前導下劃線_var命名約定,僅供內部使用
單末尾下劃線var_命名約定,避免與其他關鍵字命名沖突
雙前導雙末尾下劃線__var觸發“名稱修飾”,僅能在內部調用
雙前導雙末尾下劃線__var__魔法方法
單下劃線_用作臨時或者無意義的變量名稱

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP介紹及安裝

一、PHP語言介紹 1. PHP是一種用于創建動態交互性網站的服務器端腳本語言。PHP文件通常包含HTML標簽和一些PHP腳本代碼,這些PHP代碼可以放置在文檔的任意位置。 2. PHP文件是什么 PHP文件是一種包含有效的HTML、JavaScript代碼和PHP代碼的文件。PHP代碼在服務器上執行,并將…

《網絡彈性法案》協議達成,歐盟立法進一步臨近實施

歐盟的《網絡彈性法案》規定了所有硬件和軟件的強制性網絡安全要求 《網絡彈性法案》(CRA)是歐洲議會和歐洲理事會就即將實施的重要立法達成的政治協議。該法案于 2022 年 9 月由歐洲委員會首次提出,旨在提高數字產品的網絡安全,造…

離高薪測試你可能只差這個理解:python 內存管理機制

近期有小伙伴跟我反饋 ,面試有遇到面試官問 python 內存管理機制相關的問題,因為之前沒有特地的去了解過,所以不知道怎么回答。 所以今天就專門寫了這篇 python 內存管理機制的文章,來給大家系統的梳理一下內存管理機制的知識點&…

訪問控制技術

訪問控制是在身份認證的基礎上,根據不同身份的用戶對用戶的訪問請求加以限制。身份認證關心的是“你是誰,你是否擁有你所聲明的身份”這個問題;而訪問控制則關心“你能做什么,不能做什么”的問題。 在訪問控制過程中,一…

1.查看表的基本結構,表的詳細結構和修改表名

查看表的基本結構,表的詳細結構和修改表名 1.查看數據表基本結構 有強迫癥或健忘癥的小伙伴們在建好數據庫和表以后,通常會懷疑自己剛才是不是敲錯了,怎么辦?如果不是使用圖形界面是不是就沒法查看啦? 不存在的,這就…

大創項目推薦 醫學大數據分析 - 心血管疾病分析

文章目錄 1 前言1 課題背景2 數據處理3 數據可視化4 最后 1 前言 🔥 優質競賽項目系列,今天要分享的是 🚩 基于大數據的心血管疾病分析 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! &#x1f9…

給Flask加上百度翻譯功能,這樣可以用中文進行搜索了

上一篇博客:Flask之手搓bootstrap翻頁-CSDN博客 里,對 OMDb API - The Open Movie Database 的搜索,只能使用英文,才能搜索出電影信息,如果使用中文,是搜索不到結果的。這里就需要使用翻譯,把中…

剪映最新版的4.9,主要更新的功能(于2023年12月2日發布)

新增“多軌道音頻”功能:用戶可以將多個音頻軌道疊加在一起,并對每個音頻軌道進行單獨的編輯。這使得用戶可以更靈活地控制視頻的音頻效果。新增“音頻調音”功能:用戶可以使用音頻調音功能對視頻的音頻進行調節,包括音量、音調、…

QString::arg()函數用法(數字前補零)

QString中的arg方法類似于 (1)“C中的printf中使用的格式輸出符”和 (2)“C中string的append方法”的結合體。 常用的兩種格式如下: 1. 用于填充字符串中的%1,%2…為給定的參數。 //原型: QString QString::arg(const QString & a1) &#xff08…

多功能智能遙測終端機 5G/4G+北斗多信道 視頻采集傳輸

計訊物聯多功能智能遙測終端機,全網通5G/4G無線通信、弱信號地區北斗通信,多信道自動切換保障通信聯通,豐富網絡接口及行業應用接口,支持水利、環保、工業傳感器、控制終端、智能終端接入,模擬量/數字量/信號量采集&am…

camera2對攝像頭編碼h264

MediaCodec編碼攝像頭數據 前置:保存的一些成員變量 // 攝像頭開啟的 handler private Handler cameraHandler; // Camera session 會話 handler private Handler sessionHandler; //這里是個Context都行 private AppCompatActivity mActivity; // 這個攝像頭所有需…

深入理解 Python 中的 eval 函數

更多資料獲取 📚 個人網站:ipengtao.com eval 是 Python 中一個強大而靈活的函數,它允許將字符串作為代碼執行。然而,由于其潛在的安全風險,使用時需要謹慎。本文將深入探討 eval 函數的各個方面,包括基本…

delphi/python 實現小紅書xhs用戶作品列表和圖片/視頻無水印解析

技術學習,請勿用與非法用途!!! 成品圖用戶作品列表接口 /api/sns/web/v1/user_posted?num30&cursor&user_id642bf0850000000011022c4e&image_scenes http Get方式,請求頭需要帶上x-s x-t簽名驗證筆記明細…

直流負載箱的技術發展趨勢和創新有哪些?

直流負載箱廣泛應用于電子、通信、航空航天等領域,隨著科技的不斷發展,直流負載箱也在不斷創新和改進,直流負載箱在負載電流和電壓的測量方面要求高精度和高穩定性。未來的發展趨勢是提高負載箱的測量精度和穩定性,以滿足更高要求…

記錄一些好的文章

高效編寫可維護代碼: 如何高效編寫可維護代碼? | 菜鳥教程 (runoob.com)

計算平均分并輸出低于平均分的學生成績

從鍵盤上輸入若干&#xff08;<20&#xff09;個學生的成績&#xff0c;統計計算出平均成績&#xff0c;并輸出低于平均分的學生成績&#xff0c;用輸入負數結束輸入。 輸入格式: 在一行中輸入若干&#xff08;<20&#xff09;個學生的實型成績&#xff0c;用輸入負數結…

uniapp 使用 $emit和$on——$on中無法為data中的變量賦值

問題在于this的指向&#xff0c; 解決辦法是使用變量保存$on&#xff0c;其次再為data中的值賦值 以下是具體代碼&#xff1a; 1、html代碼&#xff1a; <view class"form_picker" click"selePositionFun()"><view class""><inp…

Git

第1章 Git 概述 Git 是一個免費的、開源的分布式版本控制系統&#xff0c;可以快速高效地處理從小型到大型的各種項目。 Git 易于學習&#xff0c;占地面積小&#xff0c;性能極快。 它具有廉價的本地庫&#xff0c;方便的暫存區域和多個工作流分支等特性。其性能優于 Subversi…

系統設計之數據庫

為您的項目選擇正確的數據庫是一項復雜的任務。許多數據庫選項都適合不同的用例&#xff0c;很快就會導致決策疲勞。 我們希望這份備忘單提供高級指導&#xff0c;以找到符合您項目需求的正確服務并避免潛在的陷阱。 注意&#xff1a;Google 關于其數據庫用例的文檔有限。盡管…

軟件測試卷王的自述,我難道真的很卷?

前言 前段時間去面試了一個公司&#xff0c;成功拿到了offer&#xff0c;薪資也從12k漲到了18k&#xff0c;對于工作都還沒兩年的我來說&#xff0c;還是比較滿意的&#xff0c;畢竟一些工作3、4年的可能還沒我高。 我可能就是大家說的卷王&#xff0c;感覺自己年輕&#xff…