最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談python 里面的單下劃線與雙下劃線的區(qū)別

 更新時間:2017年12月01日 10:30:13   作者:空氣中的臭氧  
這篇文章主要介紹了淺談python 里面的單下劃線與雙下劃線的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在學(xué)習(xí)Python的時候,很多人都不理解為什么在方法(method)前面會加好幾個下劃線,有時甚至兩邊都會加,比如像 __this__ 這種。在我看到上面的文章之前,我一直以為Python中這些下劃線的作用就像Golang中方法/函數(shù)的大小寫一樣,或是一些其他語言中的 private 、 public 的作用一樣,但仔細(xì)深究,這不全是Python這樣設(shè)計的初衷。下面我們具體分析。

主要存在四種命名

1. object # 公用方法
2. __object__ # 內(nèi)建方法,用戶不要這樣定義
3. __object # 全私有,全保護(hù)
4. _object # 半保護(hù)

核心風(fēng)格:避免用下劃線作為變量名的開始。

因為下劃線對解釋器有特殊的意義,而且是內(nèi)建標(biāo)識符所使用的符號,我們建議程序員避免用下劃線作為變量名的開始。一般來講,變量名_object被看作是“私有的”,在模塊或類外不可以使用,不能用'from module import *'導(dǎo)入。當(dāng)變量是私有的時候,用_object來表示變量是很好的習(xí)慣。

單下劃線+類名,eg:_Class__object 機(jī)制就可以訪問__object__了。因為變量名__object__對Python 來說有特殊含義,對于普通的變量應(yīng)當(dāng)避免這種命名風(fēng)格。

“單下劃線” 開始的成員變量叫做保護(hù)變量,意思是只有類對象和子類對象自己能訪問到這些變量;”雙下劃線” 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數(shù)據(jù)。(如下列所示)

以單下劃線開頭_foo的代表不能直接訪問的類屬性,需通過類提供的接口進(jìn)行訪問,不能用“from xxx import *”而導(dǎo)入;以雙下劃線開頭的__foo代表類的私有成員;以雙下劃線開頭和結(jié)尾的__foo__代表python里特殊方法專用的標(biāo)識,如 __init__()代表類的構(gòu)造函數(shù)。

class Foo():
  def __init__():
    ...

  def public_method():
    print 'This is public method'

  def __fullprivate_method():
    print 'This is fullprivate_method'

  def _halfprivate_method():
    print 'This is halfprivate_method'

  f = Foo()
  f.public_method() # OK
  f.__fullprivate_method() # Error occur
  f._halfprivate_method() # OK
  f._Foo__fullprivate_method() # OK

從上面的例子可以看出,f._halfprivate_method()可以直接訪問,確實是。不過根據(jù)python的約定,應(yīng)該將其視作private,而不要在外部使用它們,(如果你非要使用也沒轍),良好的編程習(xí)慣是不要在外部使用它。同時,根據(jù)Python docs的說明,_object和__object的作用域限制在本模塊內(nèi)。

大家看下面這段程序的輸出:

class A(object):
  def __init__(self):
    self.__private()
    self.public()
  def __private(self):
    print 'A.__private()'
  def public(self):
    print 'A.public()'
class B(A):
  def __private(self):
    print 'B.__private()'
  def public(self):
    print 'B.public()'
b = B()

初探

正確的答案是:

A.__private()
B.public()

我們分別看下類A和類B的屬性都有哪些:

>>> print '\n'.join(dir(A))
_A__private
__init__
public

>>> print '\n'.join(dir(B))
_A__private
_B__private
__init__
public

為什么類A有個名為_A__private的 屬性呢?而且__private消失了!這就要談?wù)凱ython的私有變量“矯直”了。

Python把以兩個或以上下劃線字符開頭且沒有以兩個或以上下劃線結(jié)尾的變量當(dāng)作私有變量。私有變量會在代碼生成之前被轉(zhuǎn)換為長格式(變?yōu)楣校?。轉(zhuǎn)換機(jī)制是這樣的:在變量前端插入類名,再在前端加入一個下劃線字符。這就是所謂的私有變量矯直(Private name mangling)。如類 A里的__private標(biāo)識符將被轉(zhuǎn)換為_A__private,這就是上一節(jié)出現(xiàn)_A__private和__private消失的原因了。

再講兩點題外話:

一是因為矯直會使標(biāo)識符變長,當(dāng)超過255的時候,Python會切斷,要注意因此引起的命名沖突。

二是當(dāng)類名全部以下劃線命名的時候,Python就不再執(zhí)行矯直。如:

class ____(object):
  def __init__(self):
    self.__method()
  def __method(self):
    print '____.__method()'

print '\n'.join(dir(____))
__class__
__delattr__
__dict__
__doc__
__getattribute__
__hash__
__init__
__method       # 沒被矯直
__module__
__new__
__reduce__
__reduce_ex__
__repr__
__setattr__
__str__
__weakref__

obj = ____()
____.__method()

obj.__method()   # 可以外部調(diào)用
____.__method()

現(xiàn)在我們回過頭來看看為什么會輸出“A.__private()”吧!

矯直之后,類A的代碼就變成這樣了:

class A(object):
  def __init__(self):
    self._A__private()     # 這行變了
    self.public()
  def _A__private(self):      # 這行也變了
    print 'A.__private()'
  def public(self):
    print 'A.public()'

因為在類B定義的時候沒有覆蓋__init__方法,所以調(diào)用的仍然是A.__init__,即執(zhí)行了self._A__private(),自然輸出“A.__private()”了。

下面的兩段代碼可以增加說服力,增進(jìn)理解:

class C(A):
  def __init__(self): # 重寫 __init__ ,不再調(diào)用self._A__private
    self.__private()# 這里綁定的是 _C_private
    self.public()
  def __private(self):
    print 'C.__private()'
  def public(self):
    print 'C.public()'

c = C()
答案:
C.__private()
C.public()
class A(object):
  def __init__(self):
    self._A__private()  # 調(diào)用一個沒有定義的函數(shù),但可執(zhí)行 
    self.public()
  def __private(self):
    print 'A.__private()'
  def public(self):
    print 'A.public()'

a = A()
答案:
A.__private()
A.public()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python3安裝crypto出錯及解決方法

    python3安裝crypto出錯及解決方法

    這篇文章主要介紹了python3安裝crypto出錯及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • Python圖形繪制操作之正弦曲線實現(xiàn)方法分析

    Python圖形繪制操作之正弦曲線實現(xiàn)方法分析

    這篇文章主要介紹了Python圖形繪制操作之正弦曲線實現(xiàn)方法,涉及Python使用numpy模塊數(shù)值運算及matplotlib.pyplot模塊進(jìn)行圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • python之Character string(實例講解)

    python之Character string(實例講解)

    下面小編就為大家?guī)硪黄猵ython之Character string(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python使用PEfile模塊實現(xiàn)分析PE文件

    Python使用PEfile模塊實現(xiàn)分析PE文件

    PeFile模塊是Python中一個強(qiáng)大的便攜式第三方PE格式分析工具,用于解析和處理Windows可執(zhí)行文件,本文主要就來講講如何使用PEfile模塊實現(xiàn)分析PE文件,需要的可以參考下
    2023-08-08
  • django1.8使用表單上傳文件的實現(xiàn)方法

    django1.8使用表單上傳文件的實現(xiàn)方法

    Django是一個開放源代碼的Web應(yīng)用框架,由Python寫成。這篇文章主要介紹了django1.8使用表單上傳文件的相關(guān)資料,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11
  • 基于python的matplotlib制作雙Y軸圖

    基于python的matplotlib制作雙Y軸圖

    這篇文章主要介紹了基于python的matplotlib制作雙Y軸圖,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • 讓Python更加充分的使用Sqlite3

    讓Python更加充分的使用Sqlite3

    這篇文章主要為大家詳細(xì)介紹了Python更加充分的使用Sqlite3的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python和pyqt實現(xiàn)360的CLable控件

    python和pyqt實現(xiàn)360的CLable控件

    這篇文章主要介紹了python和pyqt實現(xiàn)360的CLable控件示例,需要的朋友可以參考下
    2014-02-02
  • pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)

    pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)

    這篇文章主要介紹了pytorch 如何使用batch訓(xùn)練lstm網(wǎng)絡(luò)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • np.random.seed() 的使用詳解

    np.random.seed() 的使用詳解

    這篇文章主要介紹了np.random.seed() 的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

阳江市| 曲沃县| 北京市| 葫芦岛市| 长乐市| 汽车| 巩义市| 辉县市| 泸州市| 肥乡县| 泰兴市| 平潭县| 台州市| 齐河县| 上犹县| 黑山县| 张家港市| 台州市| 望奎县| 芦山县| 平果县| 梓潼县| 潍坊市| 陈巴尔虎旗| 乐陵市| 德惠市| 高阳县| 绥德县| 印江| 五常市| 边坝县| 通榆县| 木兰县| 张掖市| 内黄县| 门源| 景谷| 广饶县| 刚察县| 尼勒克县| 洛隆县|