python單下劃線(xiàn)和雙下劃線(xiàn)屬性區(qū)別
在Python類(lèi)中,單下劃線(xiàn)開(kāi)頭的屬性( _attr)和雙下劃線(xiàn)開(kāi)頭的屬性( __attr)主要有以下區(qū)別:
1. 命名規(guī)范與訪(fǎng)問(wèn)意圖
單下劃線(xiàn)(_attr):
屬于約定俗成的“受保護(hù)”屬性,僅作為開(kāi)發(fā)者之間的約定,提示該屬性不應(yīng)被外部直接訪(fǎng)問(wèn),但Python本身不強(qiáng)制限制訪(fǎng)問(wèn)。
本質(zhì)上和普通屬性無(wú)語(yǔ)法差異,只是一種代碼規(guī)范(PEP 8),用于標(biāo)識(shí)“內(nèi)部使用”的屬性/方法。雙下劃線(xiàn)(__attr):
屬于私有屬性,Python會(huì)對(duì)其進(jìn)行名稱(chēng)改寫(xiě)(name mangling),以防止子類(lèi)意外覆蓋或外部直接訪(fǎng)問(wèn),是一種語(yǔ)法層面的限制。
2. 名稱(chēng)改寫(xiě)機(jī)制
雙下劃線(xiàn)屬性:
Python會(huì)將__attr自動(dòng)改寫(xiě)為_類(lèi)名__attr(例如,類(lèi)A中的__x會(huì)變成_A__x),外部或子類(lèi)無(wú)法直接通過(guò)__attr訪(fǎng)問(wèn),需通過(guò)改寫(xiě)后的名稱(chēng)或類(lèi)內(nèi)方法訪(fǎng)問(wèn)。
示例:class A: def __init__(self): self.__x = 10 # 雙下劃線(xiàn)屬性 a = A() print(a.__x) # 報(bào)錯(cuò):AttributeError print(a._A__x) # 輸出10(可通過(guò)改寫(xiě)后的名稱(chēng)訪(fǎng)問(wèn))單下劃線(xiàn)屬性:
無(wú)名稱(chēng)改寫(xiě),外部仍可直接訪(fǎng)問(wèn)(如a._x),僅靠開(kāi)發(fā)者自覺(jué)遵守“不外部訪(fǎng)問(wèn)”的約定。
示例:class B: def __init__(self): self._y = 20 # 單下劃線(xiàn)屬性 b = B() print(b._y) # 輸出20(無(wú)語(yǔ)法限制)
3. 子類(lèi)繼承中的表現(xiàn)
單下劃線(xiàn)屬性:
子類(lèi)可直接繼承并訪(fǎng)問(wèn),無(wú)語(yǔ)法限制(仍靠約定)。class Parent: def __init__(self): self._x = 10 class Child(Parent): def show(self): print(self._x) # 正常輸出10 c = Child() c.show()雙下劃線(xiàn)屬性:
子類(lèi)無(wú)法直接訪(fǎng)問(wèn)父類(lèi)的雙下劃線(xiàn)屬性(因名稱(chēng)改寫(xiě)),需通過(guò)父類(lèi)提供的方法訪(fǎng)問(wèn)。class Parent: def __init__(self): self.__x = 10 def get_x(self): return self.__x class Child(Parent): def show(self): print(self.__x) # 報(bào)錯(cuò):AttributeError(子類(lèi)自身無(wú)__x) print(self.get_x()) # 輸出10(通過(guò)父類(lèi)方法訪(fǎng)問(wèn)) c = Child() c.show()
4. 用途總結(jié)
單下劃線(xiàn)(_attr):
用于標(biāo)識(shí)“內(nèi)部使用”的屬性/方法,提醒開(kāi)發(fā)者避免外部直接調(diào)用,適用于模塊內(nèi)或類(lèi)內(nèi)的私有邏輯,但不強(qiáng)制限制。
常見(jiàn)于模塊級(jí)別的“私有”函數(shù)/變量(如import *不會(huì)導(dǎo)入單下劃線(xiàn)開(kāi)頭的對(duì)象)。雙下劃線(xiàn)(__attr):
用于真正需要限制訪(fǎng)問(wèn)的場(chǎng)景(如避免子類(lèi)覆蓋父類(lèi)屬性、防止外部篡改),通過(guò)名稱(chēng)改寫(xiě)實(shí)現(xiàn)語(yǔ)法級(jí)別的隔離,但并非絕對(duì)安全(仍可通過(guò)_類(lèi)名__attr訪(fǎng)問(wèn))。
注意
Python中不存在真正的“私有”屬性,雙下劃線(xiàn)的限制可被繞過(guò),其設(shè)計(jì)目的是避免意外沖突,而非阻止惡意訪(fǎng)問(wèn)。實(shí)際開(kāi)發(fā)中,單下劃線(xiàn)的約定更常用,雙下劃線(xiàn)慎用(可能增加代碼復(fù)雜度)。
到此這篇關(guān)于python單下劃線(xiàn)和雙下劃線(xiàn)屬性區(qū)別的文章就介紹到這了,更多相關(guān)python單下劃線(xiàn)和雙下劃線(xiàn)區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中單下劃線(xiàn)與雙下劃線(xiàn)的區(qū)別及說(shuō)明
- Python中單下劃線(xiàn)和雙下劃線(xiàn)的使用詳解
- python?函數(shù)、變量中單下劃線(xiàn)和雙下劃線(xiàn)的區(qū)別詳解
- python中的單下劃線(xiàn)與雙下劃線(xiàn)以及絕對(duì)導(dǎo)入與相對(duì)導(dǎo)入
- Python中的單下劃線(xiàn)和雙下劃線(xiàn)使用場(chǎng)景詳解
- python中單下劃線(xiàn)(_)和雙下劃線(xiàn)(__)的特殊用法
- 淺談python 里面的單下劃線(xiàn)與雙下劃線(xiàn)的區(qū)別
相關(guān)文章
Python Django 通用視圖和錯(cuò)誤視圖的使用代碼
這篇文章主要介紹了Python Django 通用視圖和錯(cuò)誤視圖的使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
python使用form-data形式上傳文件請(qǐng)求的方法
Python中的multipart/form-data是一種HTTP POST請(qǐng)求的數(shù)據(jù)格式,用于上傳文件或二進(jìn)制數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python使用form-data形式上傳文件請(qǐng)求的相關(guān)資料,需要的朋友可以參考下2023-04-04
基于python實(shí)現(xiàn)生成指定大小txt文檔
這篇文章主要介紹了基于python實(shí)現(xiàn)生成指定大小txt文檔,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
快速一鍵生成Python爬蟲(chóng)請(qǐng)求頭
這篇文章主要介紹了如何快速一鍵生成Python爬蟲(chóng)請(qǐng)求頭,幫助大家更好的理解和學(xué)習(xí)使用python爬蟲(chóng),感興趣的朋友可以了解下2021-03-03
詳解如何用Python寫(xiě)個(gè)聽(tīng)小說(shuō)的爬蟲(chóng)
在路上經(jīng)常發(fā)現(xiàn)好多人都喜歡用耳機(jī)聽(tīng)小說(shuō),同事居然可以一整天的帶著一只耳機(jī)聽(tīng)小說(shuō)。本文就用Python爬蟲(chóng)實(shí)現(xiàn)下載聽(tīng)小說(shuō)tingchina.com的音頻,需要的可以參考一下2022-02-02
Python調(diào)用Elasticsearch更新數(shù)據(jù)庫(kù)的操作方法
Elasticsearch是一個(gè)分布式、多租戶(hù)的全文搜索引擎,支持HTTP Web接口和無(wú)模式的JSON文檔,本文介紹Python調(diào)用Elasticsearch更新數(shù)據(jù)庫(kù)的相關(guān)操作,感興趣的朋友一起看看吧2024-12-12

