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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python私有變量和私有方法

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-08 16:30 ? 次閱讀

python私有變量和私有方法

1. 下劃線妙用

在 Python 中,下劃線可是非常推薦使用的符號:

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

魔法方法、構造函數都需要使用雙下劃線

對于暫時用不到的變量值,可以賦值給單下劃線 _ 進行占位

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

單前導下劃線:_var

單末尾下劃線:var_

雙前導下劃線:__var

雙前導和末尾下劃線:__var__

單下劃線:_

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

上面五種寫法中,涉及到訪問控制的有:_var__var

2. 單前導下劃線 _var

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

請看下面這個例子

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

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

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

結果是:外界都可以直接訪問這兩個屬性。

但實際上,二者是有區(qū)別的。PEP 8 有提及,如果一個屬性的有單前導下劃線,則該屬性應該僅供內部訪問。

但這并不是強制性的,不然上面我們也不可能通過 self._bar 訪問到 22,但做為一名 Python 程序員最好遵守這一共識。

3. 雙前導下劃線 __var

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

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

我知道這聽起來很抽象。因此,我組合了一個小小的代碼示例來予以說明:

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

將其進行實例化,然后使用 dir() 函數查看這個對象的屬性

>>> 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.屬性名 進行訪問。

__baz 明顯和 foo_bar 不一樣,嘗試訪問后卻報了 AttributeError,屬性不存在。

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

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

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

>>> demo._Demo__baz
33

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

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

如果一個實例方法,以雙下劃線開頭,那么這個方法就是一個私有的方法,不能由實例對象或者類直接調用。

必須得通過 實例._類名__方法名 來調用。

4. 總結一下

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

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

私有變量:以雙下劃線前導的變量,可以使用 實例._類名__變量名 進行訪問

私有方法:以雙下劃線前導的方法,可以使用 實例._類名__方法名() 進行訪問

私有變量和私有方法,雖然有辦法訪問,但是仍然不建議使用上面給出的方法直接訪問,而應該用統(tǒng)一的接口(函數入口)來對私有變量進行查看、變量,對私有方法進行調用。

審核編輯:符乾江

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

    關注

    3

    文章

    4237

    瀏覽量

    61969
  • 代碼
    +關注

    關注

    30

    文章

    4671

    瀏覽量

    67770
  • python
    +關注

    關注

    53

    文章

    4753

    瀏覽量

    84081
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

    綠聯(lián)NAS DXP系列發(fā)布:內網穿透技術在私有云的應用分析

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

    請問可以私有部署嗎

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

    通過TC275 CPU0使用私有地下訪問PSDR后出錯了怎么解決?

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

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

    Mec邊緣計算與私有云是目前云計算領域中兩個熱門的概念。盡管它們都是用來處理數據、存儲和處理計算任務的技術,但在架構、功能以及應用場景等方面存在著顯著的區(qū)別。 首先,我們來說一說私有云。私有云是一種
    的頭像 發(fā)表于 12-27 15:31 ?775次閱讀

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

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

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

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

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

    ◎ 不用或者少用全局變量 說明:單個文件內部可以使用static的全局變量,可以將其理解為類的私有成員變量。全局變量應該是模塊的
    的頭像 發(fā)表于 12-07 14:42 ?268次閱讀

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

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

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

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

    python變量命名規(guī)則

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

    python用input賦值多個變量

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