日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中下划线---完全解读

發(fā)布時間:2025/3/20 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中下划线---完全解读 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python?用下劃線作為變量前綴和后綴指定特殊變量

_xxx 不能用’from module import *’導入

__xxx__ 系統(tǒng)定義名字

__xxx 類中的私有變量名

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

?

因為下劃線對解釋器有特殊的意義,而且是內(nèi)建標識符所使用的符號,我們建議程序員避免用下劃線作為變量名的開始。一般來講,變量名_xxx被看作是“私有 的”,在模塊或類外不可以使用。當變量是私有的時候,用_xxx 來表示變量是很好的習慣。因為變量名__xxx__對Python 來說有特殊含義,對于普通的變量應當避免這種命名風格。

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

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

現(xiàn)在我們來總結(jié)下所有的系統(tǒng)定義屬性和方法, 先來看下保留屬性:

>>> Class1.__doc__ # 類型幫助信息 'Class1 Doc.' >>> Class1.__name__ # 類型名稱 'Class1' >>> Class1.__module__ # 類型所在模塊 '__main__' >>> Class1.__bases__ # 類型所繼承的基類 (<type 'object'>,) >>> Class1.__dict__ # 類型字典,存儲所有類型成員信息。 <dictproxy object at 0x00D3AD70> >>> Class1().__class__ # 類型 <class '__main__.Class1'> >>> Class1().__module__ # 實例類型所在模塊 '__main__' >>> Class1().__dict__ # 對象字典,存儲所有實例成員信息。 {'i': 1234} 接下來是保留方法,可以把保留方法分類:

類的基礎方法

序號目的所編寫代碼Python 實際調(diào)用①②③④⑤
初始化一個實例x = MyClass()x.__init__()
字符串的“官方”表現(xiàn)形式repr(x)x.__repr__()
字符串的“非正式”值str(x)x.__str__()
字節(jié)數(shù)組的“非正式”值bytes(x)x.__bytes__()
格式化字符串的值format(x,?format_spec)x.__format__(format_spec)
  • 對?__init__()?方法的調(diào)用發(fā)生在實例被創(chuàng)建?之后?。如果要控制實際創(chuàng)建進程,請使用?__new__()?方法。
  • 按照約定,?__repr__()?方法所返回的字符串為合法的 Python 表達式。
  • 在調(diào)用?print(x)?的同時也調(diào)用了?__str__()?方法。
  • 由于?bytes?類型的引入而從 Python 3 開始出現(xiàn)。
  • 行為方式與迭代器類似的類

    序號目的所編寫代碼Python 實際調(diào)用①②③
    遍歷某個序列iter(seq)seq.__iter__()
    從迭代器中獲取下一個值next(seq)seq.__next__()
    按逆序創(chuàng)建一個迭代器reversed(seq)seq.__reversed__()
  • 無論何時創(chuàng)建迭代器都將調(diào)用?__iter__()?方法。這是用初始值對迭代器進行初始化的絕佳之處。
  • 無論何時從迭代器中獲取下一個值都將調(diào)用?__next__()?方法。
  • __reversed__()?方法并不常用。它以一個現(xiàn)有序列為參數(shù),并將該序列中所有元素從尾到頭以逆序排列生成一個新的迭代器。
  • 計算屬性

    序號目的所編寫代碼Python 實際調(diào)用①②③④⑤
    獲取一個計算屬性(無條件的)x.my_propertyx.__getattribute__('my_property')
    獲取一個計算屬性(后備)x.my_propertyx.__getattr__('my_property')
    設置某屬性x.my_property = valuex.__setattr__('my_property',value)
    刪除某屬性del x.my_propertyx.__delattr__('my_property')
    列出所有屬性和方法dir(x)x.__dir__()
  • 如果某個類定義了?__getattribute__()?方法,在?每次引用屬性或方法名稱時?Python 都調(diào)用它(特殊方法名稱除外,因為那樣將會導致討厭的無限循環(huán))。
  • 如果某個類定義了?__getattr__()?方法,Python 將只在正常的位置查詢屬性時才會調(diào)用它。如果實例?x?定義了屬性color,?x.color?將?不會?調(diào)用x.__getattr__('color');而只會返回x.color?已定義好的值。
  • 無論何時給屬性賦值,都會調(diào)用?__setattr__()?方法。
  • 無論何時刪除一個屬性,都將調(diào)用?__delattr__()?方法。
  • 如果定義了?__getattr__()?或?__getattribute__()?方法,?__dir__()?方法將非常有用。通常,調(diào)用?dir(x)?將只顯示正常的屬性和方法。如果__getattr()__方法動態(tài)處理color?屬性,?dir(x)?將不會將?color?列為可用屬性。可通過覆蓋?__dir__()?方法允許將?color?列為可用屬性,對于想使用你的類但卻不想深入其內(nèi)部的人來說,該方法非常有益。
  • ?

    序號目的所編寫代碼Python 實際調(diào)用??
    序列的長度len(seq)seq.__len__()
    了解某序列是否包含特定的值x in seqseq.__contains__(x)

    ?

    序號目的所編寫代碼Python 實際調(diào)用????
    通過鍵來獲取值x[key]x.__getitem__(key)
    通過鍵來設置值x[key] = valuex.__setitem__(key,value)
    刪除一個鍵值對del x[key]x.__delitem__(key)
    為缺失鍵提供默認值x[nonexistent_key]x.__missing__(nonexistent_key)

    ?

    可比較的類

    我將此內(nèi)容從前一節(jié)中拿出來使其單獨成節(jié),是因為“比較”操作并不局限于數(shù)字。許多數(shù)據(jù)類型都可以進行比較——字符串、列表,甚至字典。如果要創(chuàng)建自己的類,且對象之間的比較有意義,可以使用下面的特殊方法來實現(xiàn)比較。

    ?

    序號目的所編寫代碼Python 實際調(diào)用???????
    相等x == yx.__eq__(y)
    不相等x != yx.__ne__(y)
    小于x < yx.__lt__(y)
    小于或等于x <= yx.__le__(y)
    大于x > yx.__gt__(y)
    大于或等于x >= yx.__ge__(y)
    布爾上上下文環(huán)境中的真值if x:x.__bool__()

    ?

    可序列化的類

    ?

    Python 支持?任意對象的序列化和反序列化。(多數(shù) Python 參考資料稱該過程為 “pickling” 和 “unpickling”)。該技術(shù)對與將狀態(tài)保存為文件并在稍后恢復它非常有意義。所有的?內(nèi)置數(shù)據(jù)類型?均已支持 pickling 。如果創(chuàng)建了自定義類,且希望它能夠 pickle,閱讀?pickle 協(xié)議?了解下列特殊方法何時以及如何被調(diào)用。

    ?

    序號目的所編寫代碼Python 實際調(diào)用?????**
    自定義對象的復制copy.copy(x)x.__copy__()
    自定義對象的深度復制copy.deepcopy(x)x.__deepcopy__()
    在 pickling 之前獲取對象的狀態(tài)pickle.dump(x,?file)x.__getstate__()
    序列化某對象pickle.dump(x,?file)x.__reduce__()
    序列化某對象(新 pickling 協(xié)議)pickle.dump(x,?file,?protocol_version)x.__reduce_ex__(protocol_version)
    控制 unpickling 過程中對象的創(chuàng)建方式x = pickle.load(file)x.__getnewargs__()
    在 unpickling 之后還原對象的狀態(tài)x = pickle.load(file)x.__setstate__()

    ?

    * 要重建序列化對象,Python 需要創(chuàng)建一個和被序列化的對象看起來一樣的新對象,然后設置新對象的所有屬性。__getnewargs__()?方法控制新對象的創(chuàng)建過程,而?__setstate__()?方法控制屬性值的還原方式。

    ?

    可在?with?語塊中使用的類

    ?

    with?語塊定義了?運行時刻上下文環(huán)境;在執(zhí)行?with?語句時將“進入”該上下文環(huán)境,而執(zhí)行該語塊中的最后一條語句將“退出”該上下文環(huán)境。

    ?

    序號目的所編寫代碼Python 實際調(diào)用??
    在進入?with?語塊時進行一些特別操作with x:x.__enter__()
    在退出?with?語塊時進行一些特別操作with x:x.__exit__()

    ?

    以下是?with?file?習慣用法?的運作方式:

    # excerpt from io.py: def _checkClosed(self, msg=None): '''Internal: raise an ValueError if file is closed ''' if self.closed: raise ValueError('I/O operation on closed file.' if msg is None else msg) def __enter__(self): '''Context management protocol. Returns self.''' self._checkClosed() ① return self ② def __exit__(self, *args): '''Context management protocol. Calls close()''' self.close() ③

    ?

  • 該文件對象同時定義了一個?__enter__()?和一個?__exit__()?方法。該?__enter__()?方法檢查文件是否處于打開狀態(tài);如果沒有,?_checkClosed()方法引發(fā)一個例外。
  • __enter__()?方法將始終返回?self?—— 這是?with?語塊將用于調(diào)用屬性和方法的對象
  • 在?with?語塊結(jié)束后,文件對象將自動關(guān)閉。怎么做到的?在?__exit__()?方法中調(diào)用了?self.close()?.
  • ?

    ?該?__exit__()?方法將總是被調(diào)用,哪怕是在?with?語塊中引發(fā)了例外。實際上,如果引發(fā)了例外,該例外信息將會被傳遞給?__exit__()?方法。查閱?With 狀態(tài)上下文環(huán)境管理器?了解更多細節(jié)。

    ?

    真正神奇的東西

    ?

    如果知道自己在干什么,你幾乎可以完全控制類是如何比較的、屬性如何定義,以及類的子類是何種類型。

    ?

    序號目的所編寫代碼Python 實際調(diào)用?*????????
    類構(gòu)造器x = MyClass()x.__new__()
    類析構(gòu)器del xx.__del__()
    只定義特定集合的某些屬性?x.__slots__()
    自定義散列值hash(x)x.__hash__()
    獲取某個屬性的值x.colortype(x).__dict__['color'].__get__(x, type(x))
    設置某個屬性的值x.color = 'PapayaWhip'type(x).__dict__['color'].__set__(x, 'PapayaWhip')
    刪除某個屬性del x.colortype(x).__dict__['color'].__del__(x)
    控制某個對象是否是該對象的實例 your classisinstance(x, MyClass)MyClass.__instancecheck__(x)
    控制某個類是否是該類的子類issubclass(C, MyClass)MyClass.__subclasscheck__(C)
    控制某個類是否是該抽象基類的子類issubclass(C, MyABC)MyABC.__subclasshook__(C)

    ?

    python中以雙下劃線的是一些系統(tǒng)定義得名稱,讓python以更優(yōu)雅得語法實行一些操作,本質(zhì)上還是一些函數(shù)和變量,與其他函數(shù)和變量無二。 比如x.__add__(y) 等價于 x+y 有一些很常見,有一些可能比較偏,在這里羅列一下,做個筆記,備忘。 x.__contains__(y) 等價于 y in x, 在list,str, dict,set等容器中有這個函數(shù) __base__, __bases__, __mro__, 關(guān)于類繼承和函數(shù)查找路徑的。 class.__subclasses__(), 返回子類列表 x.__call__(...) == x(...) x.__cmp__(y) == cmp(x,y) x.__getattribute__('name') == x.name == getattr(x, 'name'), ?比__getattr__更早調(diào)用 x.__hash__() == hash(x) x.__sizeof__(), x在內(nèi)存中的字節(jié)數(shù), x為class得話, 就應該是x.__basicsize__ x.__delattr__('name') == del x.name __dictoffset__ attribute tells you the offset to where you find the pointer to the __dict__ object in any instance object that has one. It is in bytes. __flags__, 返回一串數(shù)字,用來判斷該類型能否被序列化(if it's a heap type), __flags__ & 512 S.__format__, 有些類有用 x.__getitem__(y) == x[y], 相應還有__setitem__, 某些不可修改類型如set,str沒有__setitem__ x.__getslice__(i, j) == x[i:j], 有個疑問,x='123456789', x[::2],是咋實現(xiàn)得 __subclasscheck__(), check if a class is subclass __instancecheck__(), check if an object is an instance __itemsize__, These fields allow calculating the size in bytes of instances of the type. 0是可變長度, 非0則是固定長度 x.__mod__(y) == x%y, x.__rmod__(y) == y%x x.__module__ , x所屬模塊 x.__mul__(y) == x*y, ?x.__rmul__(y) == y*x

    __reduce__, __reduce_ex__ , for pickle

    __slots__ 使用之后類變成靜態(tài)一樣,沒有了__dict__, 實例也不可新添加屬性

    __getattr__ 在一般的查找屬性查找不到之后會調(diào)用此函數(shù)

    __setattr__ 取代一般的賦值操作,如果有此函數(shù)會調(diào)用此函數(shù), 如想調(diào)用正常賦值途徑用 object.__setattr__(self, name, value)

    __delattr__ 同__setattr__, 在del obj.name有意義時會調(diào)用

    轉(zhuǎn)載于:https://www.cnblogs.com/DI-DIAO/p/8409374.html

    總結(jié)

    以上是生活随笔為你收集整理的Python中下划线---完全解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。