婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python 下劃線的多種應用場景總結

python 下劃線的多種應用場景總結

熱門標簽:公司電話機器人 騰訊外呼線路 廣告地圖標注app 唐山智能外呼系統一般多少錢 海南400電話如何申請 白銀外呼系統 哈爾濱ai外呼系統定制 激戰2地圖標注 陜西金融外呼系統

目前常見的用法有五種:

  • _用于臨時變量
  • var_用于解決命名沖突問題
  • _var用于保護變量
  • __var用于私有變量
  • __var__用于魔術方法

下面我們具體看看這些下劃線應用場景。

一、_用于臨時變量

單下劃線一般用于表示臨時變量,在REPL、for循環和元組拆包等場景中比較常見。

1.1 REPL

單下劃線在REPL中關聯的是上一次計算的非None結果。

>>> 1+1
2
>>> _
2
>>> a=2+2
>>> _
2

1+1,結果為2,賦值給_;而賦值表達式a=2+2a為4,但整個表達式結果為None,故不會關聯到_。這有點類似日常大家使用的計算器中的ANS按鍵,直接保存了上次的計算結果。

1.2 for循環中的_

for循環中_作為臨時變量用。下劃線來指代沒什么意義的變量。例如在如下函數中,當我們只關心函數執行次數,而不關心具體次序的情況下,可以使用_作為參數。

nums = 13
for _ in range(nums):
    fun_oper()

1.3 元組拆包中的_

第三個用法是元組拆包,賦值的時候可以用_來表示略過的內容。如下代碼忽略北京市人口數,只取得名字和區號。

>>> city,_,code = ('Beijing',21536000,'010')
>>> print(city,code)
Beijing 010

如果需要略過的內容多于一個的話,可以使用*開頭的參數,表示忽略多個內容。如下代碼忽略面積和人口數,只取得名字和區號

city,*_,code = ('Beijing',21536000,16410.54,'010')

1.4 國際化函數

在一些國際化編程中,_常用來表示翻譯函數名。例如gettext包使用時:

import gettext
zh = gettext.tranlation('dict','locale',languages=['zh_CN'])
zh.install()
_('hello world')

依據設定的字典文件,其返回相應的漢字“你好世界”。

1.5 大數字表示形式

_也可用于數字的分割,這在數字比較長的時候常用。

>>> a = 9_999_999_999
>>> a
9999999999

a的值自動忽略了下劃線。這樣用_分割數字,有利于便捷讀取比較大的數。

二、var_用于解決命名沖突問題

變量后面加一個下劃線。主要用于解決命名沖突問題,元編程中遇時Python保留的關鍵字時,需要臨時創建一個變量的副本時,都可以使用這種機制。

def type_obj_class(name,class_):
    pass

def tag(name,*content,class_):
    pass

以上代碼中出現的class是Python的保留關鍵字,直接使用會報錯,使用下劃線后綴的方式解決了這個問題。

三、_var用于保護變量

前面一個下劃線,后面加上變量,這是僅供內部使用的“保護變量”。比如函數、方法或者屬性。

這種保護不是強制規定,而是一種程序員的約定,解釋器不做訪問控制。一般來講這些屬性都作為實現細節而不需要調用者關心,隨時都可能改變,我們編程時雖然能訪問,但是不建議訪問。

這種屬性,只有在導入時,才能發揮保護作用。而且必須是from XXX import *這種導入形式才能發揮保護作用。

使用from XXX import *是一種通配導入(wildcard import),這是Python社區不推薦的方式,因為你根本搞不清你到底導入了什么屬性、方法,很可能搞亂你自己的命名空間。PEP8推薦的導入方式是from XXX import aVar , b_func , c_func這種形式。

比如在下例汽車庫函數tools.py里定義的“保護屬性”:發動機型號和輪胎型號,這屬于實現細節,沒必要暴露給用戶。當我們使用from tools import * 語句調用時,其實際并沒有導入所有_開頭的屬性,只導入了普通drive方法。

_moto_type = 'L15b2'
_wheel_type = 'michelin'

def drive():
    _start_engine()
    _drive_wheel()

def _start_engine():
    print('start engine %s'%_moto_type)
    
def _drive_wheel():
    print('drive wheel %s'%_wheel_type)

查看命令空間print(vars())可見,只有drive函數被導入進來,其他下劃線開頭的“私有屬性”都沒有導入進來。

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': _frozen_importlib_external.SourceFileLoader object at 0x005CF868>, '__spec__': None, '__annotations__':{}, '__builtins__': module 'builtins' (built-in)>, '__file__': '.\\xiahuaxian.py', '__cached__': None, 'walk': function walk at 0x01DA8C40>, 'root': '.\\__pycache__', '_': [21536000, 16410.54], 'dirs': ['tools.cpython-38.pyc'], 'city': 'Beijing', 'code': '010', 'drive': function drive at 0x01DBC4A8>}

3.1 突破保護屬性

之所以說是“保護”并不是“私有”,是因為Python沒有提供解釋器機制來控制訪問權限。我們依然可以訪問這些屬性:

import tools
tools._moto_type = 'EA211'
tools.drive()

以上代碼,以越過“保護屬性”。此外,還有兩種方法能突破這個限制,一種是將“私有屬性”添加到tool.py文件的__all__列表里,使from tools import *也導入這些本該隱藏的屬性。

__all__ = ['drive','_moto_type','_wheel_type']

另一種是導入時指定“受保護屬性”名。

from tools import drive,_start_engine
_start_engine()

甚至是,使用import tools也可以輕易突破保護限制。所以可見,“保護屬性”是一種簡單的隱藏機制,只有在from tools import *時,由解釋器提供簡單的保護,但是可以輕易突破。這種保護更多地依賴程序員的共識:不訪問、修改“保護屬性”。除此之外,有沒有更安全的保護機制呢?有,就是下一部分討論的私有變量。

四、__var用于私有變量

私有屬性解決的之前的保護屬性保護力度不夠的問題。變量前面加上兩個下劃線,類里面作為屬性名和方法都可以。兩個下劃線屬性由Python的改寫機制來實現對這個屬性的保護。

看下面汽車例子中,品牌為普通屬性,發動機為“保護屬性”,車輪品牌為“私有屬性”。

class Car:
    def __init__(self):
        self.brand = 'Honda'
        self._moto_type = 'L15B2'
        self.__wheel_type = 'michelin'

    def drive(self):
        print('Start the engine %s,drive the wheel %s,I get a running %s car'%
        (self._moto_type,
        self.__wheel_type,
        self.brand))

我們用var(car1)查看下具體屬性值,

['_Car__wheel_type', '__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__', '_moto_type', 'brand', 'drive']

可見,實例化car1中,普通屬性self.brand和保護屬性self._moto_type都得以保存,兩個下劃線的私有屬性__wheel_type沒有了。取而代之的是_Car_wheel_type這個屬性。這就是改寫機制(Name mangling)。兩個下劃線的屬性,被改寫成帶有類名前綴的變量,這樣子類很難明明一個和如此復雜名字重名的屬性。保證了屬性不被重載,保證了其的私有性。

4.1 突破私有屬性

這里“私有變量”的實現,是從解釋器層面給與的改寫,保護了私有變量。但是這個機制并非絕對安全,因為我們依然可以通過obj._ClasssName__private來訪問__private私有屬性。

car1.brand = 'Toyota'
car1._moto_type = '6AR-FSE'
car1._Car__wheel_type = 'BRIDGESTONE'
car1.drive()

結果

Start the engine 6AR-FSE,\
drive the wheel BRIDGESTONE,\
I get a running Toyota car

可見,對改寫機制改寫的私有變量,雖然保護性加強了,但依然可以訪問并修改。只是這種修改,只是一種雜耍般的操作,并不可取。

五、__var__用于魔術方法

變量前面兩個下劃線,后面兩個下劃線。這是Python當中的魔術方法,一般是給系統程序調用的。例如上例中的__init__就是類的初始化魔術方法,還有支持len函數的__len__方法,支持上下文管理器協議的__enter__和__exit__方法,支持迭代器協議的__iter__方法,支持格式化顯示的__repr__和__str__方法等等。這里我們為上例的Car類添加魔術方法__repr__來支持格式化顯示。

    def __repr__(self):
        return '***Car %s:with %s Engine,%sWheel***'%
        (self.brand,self._moto_type,self.__wheel_type)

未添加__repr__魔術方法之前,print(car1)結果為__main__.Car object at 0x0047F7F0>,這個結果讓人看的一頭霧水,增加repr魔術方法之后,顯示結果為***Car Toyota:with 6AR-FSE Engine,BRIDGESTONE Wheel***清晰明了,利于調試。這就是魔術方法的功效:支持系統調用,改進用戶類表現,增加協議支持,使用戶類表現得更像系統類。

5.1 Python魔術方法分類

以下所有魔術方法均需要在前后加上__,這里省略了這些雙下劃線。

  • 一元運算符 neg pos abs invert
  • 轉換 complex int float round inex
  • 算術運算 add sub mul truediv floordiv mod divmod pow lshift rshift and xor or

算術運算除and之外,前面再加上r,表示反運算。除dimod外,前面加上i,表示就地運算。

  • 比較 lt le eq ne gt ge
  • 類屬性 getattr getattribute setattr delattr dir get set delete
  • 格式化 bytes hash bool format
  • 類相關 init del new
  • 列表 getitem
  • 迭代器 iter next
  • 上下文管理器 enter exit

六、總結

總之,下劃線在 Python 當中應用還是很廣泛的,甚至可以說 Python 對下劃線有所偏愛

可以看到 _常用于臨時變量,在REPL,for循環,元組拆包和國際化中得到了廣泛應用

var_用于解決命名沖突問題,使用時比較簡單易懂的。_var對變量的保護,只是一種脆弱的保護,更多依靠程序員的約定。__var用于私有變量,借助改寫機制支持,已經支持了私有變量,但是仍然存在漏洞

對__var__用于魔術方法,進行了一個簡單的介紹,魔術方法較多,但是理解并不復雜。希望以后可以進一步介紹這些魔術方法

以上就是python 下劃線的多種應用場景總結的詳細內容,更多關于python 下劃線應用場景的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • python 下劃線的不同用法
  • Python下劃線5種含義代碼實例解析
  • Python中的單下劃線和雙下劃線使用場景詳解
  • python中單下劃線(_)和雙下劃線(__)的特殊用法
  • Python中使用雙下劃線防止類屬性被覆蓋問題
  • Python3中_(下劃線)和__(雙下劃線)的用途和區別
  • 不知道這5種下劃線的含義,你就不算真的會Python!
  • python中單下劃線_的常見用法總結
  • 淺談python 里面的單下劃線與雙下劃線的區別
  • Python中單、雙下劃線的區別總結
  • Python中的下劃線詳解
  • Python中下劃線的使用方法

標簽:四川 黔西 常德 益陽 鷹潭 惠州 黑龍江 上海

巨人網絡通訊聲明:本文標題《python 下劃線的多種應用場景總結》,本文關鍵詞  python,下劃線,的,多種,應用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python 下劃線的多種應用場景總結》相關的同類信息!
  • 本頁收集關于python 下劃線的多種應用場景總結的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品国产一区二区国模嫣然| 欧美激情一区二区三区全黄| 日韩和的一区二区| 欧美激情综合在线| 国产精品免费视频一区| 国产精品女同互慰在线看| 国产精品久久久久aaaa| 国产精品入口麻豆原神| 国产精品久久久久影视| 午夜视频一区在线观看| 久久狠狠亚洲综合| 成人一区二区三区视频| 97se亚洲国产综合在线| 国产一区二区三区四| 国产99久久久国产精品免费看| caoporen国产精品视频| 色网站国产精品| 91精品免费观看| 日韩欧美一区二区不卡| 亚洲精品在线电影| 成人免费在线观看入口| 日日夜夜免费精品视频| 国产精品影视网| 国产精品一区二区三区乱码| 不卡视频免费播放| 51久久夜色精品国产麻豆| 久久夜色精品一区| 蜜臀久久99精品久久久久宅男 | 中文字幕不卡在线播放| 伊人婷婷欧美激情| 日本不卡不码高清免费观看| 成人免费视频一区| 欧洲亚洲精品在线| 日韩欧美视频一区| 一区二区三区四区高清精品免费观看| 免费看精品久久片| 91女人视频在线观看| 欧美日韩国产免费| 久久久久久久久久久久电影| 亚洲精品高清在线观看| 国产成人亚洲精品青草天美| 日韩欧美激情在线| 亚洲精品免费看| 亚洲小说春色综合另类电影| 国产精品中文欧美| 欧美一区二区福利视频| 亚洲一级二级三级在线免费观看| 99久精品国产| 国产精品毛片大码女人| 国产成人免费视频网站高清观看视频 | 日本精品一区二区三区四区的功能| 久久久美女毛片| 精品午夜一区二区三区在线观看 | 日韩毛片一二三区| 久久男人中文字幕资源站| 美女任你摸久久| 精品三级在线看| 国产精品久久三| 欧洲精品一区二区| 午夜精品久久久久影视| 亚洲精选免费视频| 精品亚洲成a人| 粉嫩av一区二区三区| 一区二区三区四区不卡在线 | 91麻豆精品国产91久久久使用方法| 丁香天五香天堂综合| 日韩精品高清不卡| 亚洲国产成人精品视频| 欧美一级黄色大片| 免费在线观看一区| 制服丝袜中文字幕亚洲| 日本系列欧美系列| 亚洲高清一区二区三区| 一区二区三区在线高清| 久久免费看少妇高潮| 日本一区二区综合亚洲| 色综合色狠狠天天综合色| 亚洲地区一二三色| 一区二区三区中文字幕| 日韩视频永久免费| 天涯成人国产亚洲精品一区av| 日韩美女视频一区二区在线观看| 日韩中文字幕不卡| 麻豆国产欧美日韩综合精品二区| 欧美日韩卡一卡二| 精品亚洲成a人在线观看| 中文字幕中文字幕中文字幕亚洲无线| 色先锋久久av资源部| 国产精品传媒视频| 精品一区二区精品| 国产九色sp调教91| 久久久www成人免费无遮挡大片| 久久av中文字幕片| 亚洲一线二线三线视频| 欧亚洲嫩模精品一区三区| 色欧美乱欧美15图片| 国产成人在线免费| 激情综合色综合久久| 国产精品人成在线观看免费 | 欧洲视频一区二区| 久久综合色鬼综合色| 亚洲精品一区在线观看| 欧美日韩亚洲另类| 4438x亚洲最大成人网| 亚洲一区在线看| 国产欧美视频一区二区| 国产91丝袜在线18| 国产麻豆精品一区二区| 一区二区在线看| 中文字幕av一区二区三区| 日韩理论电影院| 国产专区综合网| 久久久不卡网国产精品二区| 欧美一区二区免费观在线| 成人午夜免费视频| 18涩涩午夜精品.www| 国产成人午夜精品5599| 国产欧美日韩精品一区| 一本久久精品一区二区| 国产午夜精品久久久久久免费视 | 奇米色一区二区三区四区| 精品国产免费一区二区三区四区 | 91麻豆成人久久精品二区三区| 日本va欧美va欧美va精品| 一区二区日韩av| 亚洲视频一二区| 国产欧美一区二区三区在线看蜜臀| 91精品黄色片免费大全| 日本高清免费不卡视频| 在线不卡a资源高清| 97se亚洲国产综合自在线| 国产xxx精品视频大全| 久久精品久久99精品久久| 五月天精品一区二区三区| 亚洲精品大片www| 中文字幕亚洲电影| 国产精品久久久久久久久久免费看| 精品国内片67194| 欧美xxxxxxxx| 日韩精品一区二区三区在线观看 | 在线播放/欧美激情| 欧美日韩午夜影院| 欧美中文字幕一区| 一本色道久久综合亚洲aⅴ蜜桃| 成人教育av在线| 成人免费视频网站在线观看| 国产成人免费视频| 91麻豆精品国产91久久久久久久久 | 欧美区在线观看| 91精品国产色综合久久ai换脸| 色婷婷精品大视频在线蜜桃视频 | 国产酒店精品激情| 欧美中文字幕一区二区三区亚洲| 成人激情综合网站| 欧美日韩美女一区二区| 日韩一区二区三| 欧美大白屁股肥臀xxxxxx| 激情文学综合网| 六月婷婷色综合| 91毛片在线观看| 国产精品人成在线观看免费| 久久女同精品一区二区| 91精彩视频在线观看| 日韩美一区二区三区| 久久亚洲精精品中文字幕早川悠里| 《视频一区视频二区| 麻豆视频观看网址久久| 国产精品盗摄一区二区三区| 最新欧美精品一区二区三区| 国产精品久久久久久久久快鸭| 国产精品视频免费看| 欧美xxxxxxxx| 国产福利一区在线| 欧美成人a视频| 成人app软件下载大全免费| 91精品国产免费久久综合| 免费成人在线影院| 在线视频国内自拍亚洲视频| 久久综合色婷婷| 日韩精品电影在线| 国产一区二区三区视频在线播放| 成人综合在线视频| 美女视频一区二区三区| 99精品热视频| 日韩无一区二区| 国产不卡在线播放| 国产午夜精品理论片a级大结局 | 欧美日韩你懂得| 日韩精品一区第一页| 青娱乐精品视频| 国产精品久久久久久久久图文区| 国产一区二区h| 精品国产一区二区三区忘忧草| 国产精品美女久久久久久久久久久 | 激情av综合网| 欧美人与性动xxxx| 日本视频在线一区| 国产日本欧洲亚洲| 久久爱www久久做| 中文字幕va一区二区三区|