0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python私有變量和私有方法

python爬蟲知識(shí)分享 ? 來(lái)源:python爬蟲知識(shí)分享 ? 作者:python爬蟲知識(shí)分享 ? 2022-03-08 16:30 ? 次閱讀

python私有變量和私有方法

1. 下劃線妙用

在 Python 中,下劃線可是非常推薦使用的符號(hào):

變量名推薦使用下劃線分隔的蛇形命名法

魔法方法、構(gòu)造函數(shù)都需要使用雙下劃線

對(duì)于暫時(shí)用不到的變量值,可以賦值給單下劃線 _ 進(jìn)行占位

根據(jù)分類,我把下劃線寫法分成下面五種:

單前導(dǎo)下劃線:_var

單末尾下劃線:var_

雙前導(dǎo)下劃線:__var

雙前導(dǎo)和末尾下劃線:__var__

單下劃線:_

由于篇幅所限,本篇將只介紹跟標(biāo)題(私有變量與私有方法)有關(guān)的用法,也就是訪問(wèn)控制。

上面五種寫法中,涉及到訪問(wèn)控制的有:_var__var

2. 單前導(dǎo)下劃線 _var

下劃線前綴的含義是告知其他程序員以單個(gè)下劃線開頭的變量或方法僅供內(nèi)部使用。

請(qǐng)看下面這個(gè)例子

class Demo:
   def __init__(self):
       self.foo = 11
       self._bar = 22

如果你實(shí)例化此類,然后分別訪問(wèn) self.fooself._bar 會(huì)發(fā)生什么情況?

>>> demo = Demo()
>>> demo.foo
11
>>> demo._bar
22

結(jié)果是:外界都可以直接訪問(wèn)這兩個(gè)屬性。

但實(shí)際上,二者是有區(qū)別的。PEP 8 有提及,如果一個(gè)屬性的有單前導(dǎo)下劃線,則該屬性應(yīng)該僅供內(nèi)部訪問(wèn)。

但這并不是強(qiáng)制性的,不然上面我們也不可能通過(guò) self._bar 訪問(wèn)到 22,但做為一名 Python 程序員最好遵守這一共識(shí)。

3. 雙前導(dǎo)下劃線 __var

雙下劃線前綴會(huì)導(dǎo)致Python解釋器重寫屬性名稱,以避免子類中的命名沖突。

這也叫做名稱修飾(name mangling) - 解釋器更改變量的名稱,以便在類被擴(kuò)展的時(shí)候不容易產(chǎn)生沖突。

我知道這聽起來(lái)很抽象。因此,我組合了一個(gè)小小的代碼示例來(lái)予以說(shuō)明:

class Demo:
   def __init__(self):
       self.foo = 11
       self._bar = 22
       self.__baz = 33

將其進(jìn)行實(shí)例化,然后使用 dir() 函數(shù)查看這個(gè)對(duì)象的屬性

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

不難發(fā)現(xiàn),foo_bar 都很正常,可以使用 demo.屬性名 進(jìn)行訪問(wèn)。

__baz 明顯和 foo 、 _bar 不一樣,嘗試訪問(wèn)后卻報(bào)了 AttributeError,屬性不存在。

>>> demo.__baz
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'Demo' object has no attribute '__baz'

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

如果想訪問(wèn),那得按照 dir 提示的寫法去訪問(wèn),在 __baz 前面加上 _類名

>>> demo._Demo__baz
33

總結(jié)可得,使用雙下劃線開頭的屬性變量,就是一個(gè)私有變量。

這樣的規(guī)則在屬性上生效,在方法上也同樣適用。

如果一個(gè)實(shí)例方法,以雙下劃線開頭,那么這個(gè)方法就是一個(gè)私有的方法,不能由實(shí)例對(duì)象或者類直接調(diào)用。

必須得通過(guò) 實(shí)例._類名__方法名 來(lái)調(diào)用。

4. 總結(jié)一下

Python并沒有真正的私有化支持,但可用下劃線得到偽私有。

盡量避免定義以下劃線開頭的變量。

私有變量:以雙下劃線前導(dǎo)的變量,可以使用 實(shí)例._類名__變量名 進(jìn)行訪問(wèn)

私有方法:以雙下劃線前導(dǎo)的方法,可以使用 實(shí)例._類名__方法名() 進(jìn)行訪問(wèn)

私有變量和私有方法,雖然有辦法訪問(wèn),但是仍然不建議使用上面給出的方法直接訪問(wèn),而應(yīng)該用統(tǒng)一的接口(函數(shù)入口)來(lái)對(duì)私有變量進(jìn)行查看、變量,對(duì)私有方法進(jìn)行調(diào)用。

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62228
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68083
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84289
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    公有IP與私有IP之間的區(qū)別

    今天我們來(lái)分享私有IP地址和公有IP地址的有什么區(qū)別?主要從接入方式、特點(diǎn)以及各自的優(yōu)勢(shì)來(lái)說(shuō)明。
    的頭像 發(fā)表于 09-21 10:49 ?171次閱讀

    美國(guó)洛杉磯私有云核心優(yōu)勢(shì)是什么?

    美國(guó)洛杉磯私有云以其高安全性、優(yōu)越的地理位置、強(qiáng)大的硬件資源和出色的服務(wù)質(zhì)量而備受全球企業(yè)和個(gè)人用戶的青睞。在全球化的科技與經(jīng)濟(jì)格局中,選擇一個(gè)合適的私有云服務(wù)平臺(tái)對(duì)于企業(yè)和個(gè)人的數(shù)字化轉(zhuǎn)型至關(guān)重要。Rak部落為您整理發(fā)布美國(guó)洛杉磯私有
    的頭像 發(fā)表于 08-12 10:21 ?143次閱讀

    基于WDS的天瑞水泥企業(yè)高性能私有云存儲(chǔ)方案

    基于WDS的天瑞水泥企業(yè)高性能私有云存儲(chǔ)方案
    的頭像 發(fā)表于 07-31 09:47 ?198次閱讀
    基于WDS的天瑞水泥企業(yè)高性能<b class='flag-5'>私有</b>云存儲(chǔ)方案

    海外青云私有云:企業(yè)的數(shù)字化轉(zhuǎn)型得力助手

    在全球化日益加深的今天,海外企業(yè)對(duì)于云計(jì)算的需求也愈發(fā)迫切。青云(QingCloud)作為一家領(lǐng)先的云計(jì)算服務(wù)提供商,其私有云產(chǎn)品在海外市場(chǎng)上受到了廣泛的關(guān)注和認(rèn)可。那么,海外青云私有云究竟有何用處呢?本文將從多個(gè)角度為您科普。
    的頭像 發(fā)表于 06-25 10:11 ?190次閱讀

    綠聯(lián)NAS DXP系列發(fā)布:內(nèi)網(wǎng)穿透技術(shù)在私有云的應(yīng)用分析

    對(duì)于NAS私有云來(lái)說(shuō),內(nèi)外穿透會(huì)在不同網(wǎng)絡(luò)環(huán)境(如內(nèi)網(wǎng)和外網(wǎng))之間實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)和共享的能力,在這個(gè)背景下,內(nèi)外穿透技術(shù)對(duì)于NAS私有云來(lái)說(shuō)可能具有以下潛在應(yīng)用
    的頭像 發(fā)表于 05-24 12:06 ?315次閱讀
    綠聯(lián)NAS DXP系列發(fā)布:內(nèi)網(wǎng)穿透技術(shù)在<b class='flag-5'>私有</b>云的應(yīng)用分析

    請(qǐng)問(wèn)可以私有部署嗎

    有沒有插件或者私有部署的服務(wù)
    發(fā)表于 02-01 16:00

    通過(guò)TC275 CPU0使用私有地下訪問(wèn)PSDR后出錯(cuò)了怎么解決?

    通過(guò) TC275 CPU0 使用私有地下訪問(wèn)PSDR后出錯(cuò)了。再次 downloading,defale 還沒有,有解決方法嗎?
    發(fā)表于 01-19 08:07

    mec邊緣計(jì)算與私有云的區(qū)別

    Mec邊緣計(jì)算與私有云是目前云計(jì)算領(lǐng)域中兩個(gè)熱門的概念。盡管它們都是用來(lái)處理數(shù)據(jù)、存儲(chǔ)和處理計(jì)算任務(wù)的技術(shù),但在架構(gòu)、功能以及應(yīng)用場(chǎng)景等方面存在著顯著的區(qū)別。 首先,我們來(lái)說(shuō)一說(shuō)私有云。私有云是一種
    的頭像 發(fā)表于 12-27 15:31 ?850次閱讀

    python環(huán)境變量的配置pip

    Python環(huán)境變量的配置和使用是每個(gè)Python開發(fā)者都需要了解和掌握的基本技能之一。在本文中,我們將詳細(xì)介紹如何正確配置Python環(huán)境變量
    的頭像 發(fā)表于 12-15 15:41 ?2227次閱讀

    私有VLAN(cisco)和MUX VLAN(HUAWEI)

    私有vlan是一種機(jī)制,將特定VLAN劃分成任意數(shù)量的不會(huì)相互重疊的二級(jí)VLAN(Secondary VLAN)。劃分過(guò)程對(duì)于外部網(wǎng)絡(luò)是不可見的,外部網(wǎng)絡(luò)只能看到原始的VLAN,稱為主VLAN(Primary VLAN)。
    的頭像 發(fā)表于 12-10 10:20 ?1064次閱讀
    <b class='flag-5'>私有</b>VLAN(cisco)和MUX VLAN(HUAWEI)

    如何在嵌入式C編碼中規(guī)范變量

    ◎ 不用或者少用全局變量 說(shuō)明:?jiǎn)蝹€(gè)文件內(nèi)部可以使用static的全局變量,可以將其理解為類的私有成員變量。全局變量應(yīng)該是模塊的
    的頭像 發(fā)表于 12-07 14:42 ?303次閱讀

    pycharm怎么配置python環(huán)境變量

    正確的 Python 環(huán)境變量是非常重要的,因?yàn)樗鼤?huì)影響到項(xiàng)目的運(yùn)行和依賴包的安裝。本文將詳細(xì)介紹如何在 PyCharm 中配置 Python 環(huán)境變量。 PyCharm 支持在全局和
    的頭像 發(fā)表于 11-29 14:56 ?2561次閱讀

    安裝python怎么添加到環(huán)境變量

    Python是一種簡(jiǎn)單易學(xué)的腳本語(yǔ)言,廣泛應(yīng)用于開發(fā)各種類型的應(yīng)用程序。為了在Windows操作系統(tǒng)上使用Python的命令行工具,需要將Python添加到系統(tǒng)的環(huán)境變量中。本文將向您
    的頭像 發(fā)表于 11-23 16:40 ?2657次閱讀

    python變量命名規(guī)則

    Python是一種高級(jí)編程語(yǔ)言,廣泛應(yīng)用于軟件開發(fā)、數(shù)據(jù)分析和科學(xué)計(jì)算等領(lǐng)域。在Python中,變量是用來(lái)存儲(chǔ)數(shù)據(jù)的容器,它們具有名稱以及與之關(guān)聯(lián)的值。然而,變量的命名并不是隨意的,而
    的頭像 發(fā)表于 11-23 15:44 ?1123次閱讀

    python用input賦值多個(gè)變量

    ,并提供示例代碼。 Python中的 input 函數(shù)用于從標(biāo)準(zhǔn)輸入中讀取一行文本,并返回一個(gè)字符串。要將輸入的值賦給多個(gè)變量,可以使用字符串的 split 方法將輸入值拆分為多個(gè)部分。 split
    的頭像 發(fā)表于 11-23 15:37 ?2893次閱讀