成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:2日期:2022-06-19 18:56:06
目錄一、_用于臨時變量1.1 REPL1.2 for循環中的_1.3 元組拆包中的_1.4 國際化函數1.5 大數字表示形式二、var_用于解決命名沖突問題三、_var用于保護變量3.1 突破保護屬性四、__var用于私有變量4.1 突破私有屬性五、__var__用于魔術方法5.1 Python魔術方法分類六、總結

目前常見的用法有五種:

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

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

一、_用于臨時變量

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

1.1 REPL

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

>>> 1+12>>> _2>>> a=2+2>>> _2

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

1.2 for循環中的_

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

nums = 13for _ 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 gettextzh = gettext.tranlation(’dict’,’locale’,languages=[’zh_CN’])zh.install()_(’hello world’)

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

1.5 大數字表示形式

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

>>> a = 9_999_999_999>>> a9999999999

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

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

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

def type_obj_class(name,class_): passdef 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 toolstools._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 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产欧美日本一区视频| 国产成人综合亚洲91猫咪| 欧美日韩一区二区三区在线视频| 亚洲成人av电影在线| 中文字幕乱码亚洲精品一区 | 亚洲欧美在线视频| 777精品伊人久久久久大香线蕉| 欧美精品一级| 国产suv精品一区二区6| 丝袜美腿一区二区三区| 国产日产欧美一区二区视频| 337p亚洲精品色噜噜噜| 久久婷婷丁香| 亚洲九九精品| 欧美成人午夜| 成人av网在线| 国产一区二区三区四区在线观看| 天堂成人国产精品一区| 亚洲综合区在线| 国产精品久久一卡二卡| 精品国产免费视频| 在线成人小视频| 色久优优欧美色久优优| 另类图片国产| 一本色道88久久加勒比精品| 国产精品porn| 欧美日韩一区在线播放| 99久久婷婷国产| 成人avav影音| www.综合网.com| 成人av在线影院| 成人福利视频在线看| 国产成人在线视频网站| 乱一区二区av| 久久精品免费观看| 蜜臀av性久久久久蜜臀aⅴ| 一级精品视频在线观看宜春院| 久久久久久久久久美女| 日韩欧美高清在线| 这里是久久伊人| 91精品视频网| 欧美一级二级三级蜜桃| 欧美一级在线免费| 精品不卡在线视频| 精品999久久久| 日韩视频在线观看一区二区| 91精品国产福利在线观看| 欧美二区乱c少妇| 欧美日产在线观看| 欧美日韩国产大片| 精品婷婷伊人一区三区三| 精品视频一区二区三区免费| 老司机午夜免费精品视频 | 免费av成人在线| 日韩va欧美va亚洲va久久| 五月婷婷激情综合| 免费久久99精品国产| 热久久国产精品| 精品亚洲aⅴ乱码一区二区三区| 精品一区二区免费看| 国产精品18久久久久久久久久久久| 精品一区二区三区不卡| 粉嫩高潮美女一区二区三区| 99久久综合色| 激情婷婷欧美| 久久裸体视频| 欧美色图天堂网| 日韩一区二区免费电影| www国产亚洲精品久久麻豆| 欧美高清在线一区二区| 一区二区在线电影| 日本中文在线一区| 高清成人在线观看| 欧美精品日本| 午夜亚洲福利在线老司机| 在线精品亚洲一区二区不卡| 欧美一区二区三区四区在线观看| 久久中文娱乐网| 中文字幕在线观看一区| 石原莉奈一区二区三区在线观看| 美女网站一区二区| 国产xxx精品视频大全| 国内精品久久久久久久影视麻豆 | 精品电影一区二区| 亚洲视频在线一区观看| 日韩激情在线观看| 国产高清不卡二三区| 欧美日韩国产三区| 亚洲女人av| 欧美高清你懂得| 久久午夜色播影院免费高清| 亚洲另类在线一区| 久久99久久99| 99精品1区2区| 亚洲免费网站| 日韩免费看的电影| 亚洲精品成人悠悠色影视| 激情伊人五月天久久综合| 91麻豆swag| 一本大道久久a久久综合婷婷| 日韩三级精品电影久久久| 亚洲国产成人在线| 日本成人在线不卡视频| bt欧美亚洲午夜电影天堂| 国产手机视频一区二区| 在线播放中文一区| 亚洲欧洲综合另类| 国产一区二区按摩在线观看| 激情视频一区二区| 7777精品伊人久久久大香线蕉超级流畅| 中文字幕不卡在线播放| 日韩精品一二三| 99久久国产免费看| 久久精品毛片| 国产欧美精品一区aⅴ影院| 日韩高清国产一区在线| 你懂的国产精品永久在线| 久久综合九色综合久99| 26uuu成人网一区二区三区| 婷婷六月综合亚洲| 欧美日韩精品免费看 | 欧美日韩国产片| 亚洲欧美日韩中文字幕一区二区三区 | 日韩一级成人av| 亚洲一区电影777| 99精品偷自拍| 在线播放亚洲一区| 亚洲国产中文字幕在线视频综合| 91网站在线播放| 欧美在线短视频| 亚洲黄色免费电影| 99re热这里只有精品免费视频| 久久综合给合久久狠狠色| 一区二区中文字幕在线| av中文字幕亚洲| 欧美顶级少妇做爰| 日韩激情一区二区| 99视频在线精品国自产拍免费观看| 91精品国产综合久久香蕉麻豆| 亚洲一区成人在线| 国产一区视频观看| 精品美女一区二区| 久久不见久久见免费视频7| 国产亚洲午夜| 欧美极品aⅴ影院| 成人黄色电影在线| 欧美日韩大陆一区二区| 午夜精品久久久久久久| 一区二区三区欧美在线| 国产精品萝li| 欧美ab在线视频| 欧美大白屁股肥臀xxxxxx| 美女爽到高潮91| 免费在线成人av| 一区二区视频在线看| 欧美黄色免费| 久久蜜桃av一区二区天堂 | 欧洲一区二区三区在线| 一区二区理论电影在线观看| 欧美午夜精品| 日本一二三不卡| 欧美日韩喷水| 国产精品亲子伦对白| 午夜激情一区| 日本一区二区电影| 欧美精品aa| 国产精品成人网| 国产一区自拍视频| 国产欧美日韩综合精品一区二区| 成年人午夜久久久| 久久久噜噜噜久噜久久综合| 成人国产一区二区三区精品| 精品va天堂亚洲国产| aaa欧美日韩| 久久久99精品免费观看| 91麻豆自制传媒国产之光| 久久精品在这里| 欧美午夜国产| 综合分类小说区另类春色亚洲小说欧美 | 五月天中文字幕一区二区| 亚洲大片在线| 国产精品网友自拍| 一区二区在线不卡| 亚洲精品视频观看| 午夜在线a亚洲v天堂网2018| 国产精品一二三四五| 日韩不卡免费视频| 91在线码无精品| 久久久久九九视频| 亚洲一区二区精品久久av| 久久久99精品免费观看不卡| 欧美精品一区二区三区在线播放| 久久久美女毛片| 中文一区二区在线观看| 综合分类小说区另类春色亚洲小说欧美| 国产欧美综合色| 亚洲特黄一级片| 亚洲二区在线观看| 久热成人在线视频| 国产乱子伦一区二区三区国色天香 |