python中那些雙下劃線開頭得函式和變數
Python 用下劃線作為變數字首和字尾指定特殊變數
_xxx 不能用’from module import *’匯入
__xxx__ 系統定義名字
__xxx 類中的私有變數名
核心風格:避免用下劃線作為變數名的開始。
因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下劃線作為變數名的開始。一般來講,變數名_xxx被看作是“私有 的”,在模組或類外不可以使用。當變數是私有的時候,用_xxx 來表示變數是很好的習慣。因為變數名__xxx__對Python 來說有特殊含義,對於普通的變數應當避免這種命名風格。
“單下劃線” 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數;
“雙下劃線” 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到這個資料。
以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用“from xxx import *”而匯入;以雙下劃線開頭的(__foo)代表類的私有成員;以雙下劃線開頭和結尾的(__foo__)代表python裡特殊方法專用的標識,如 __init__()代表類的建構函式。
現在我們來總結下所有的系統定義屬性和方法, 先來看下保留屬性:
>>> 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 實際呼叫 |
---|---|---|---|
① | 初始化一個例項 | x = MyClass() |
|
② | 字串的“官方”表現形式 | repr(x) |
|
③ | 字串的“非正式”值 | x.__str__() |
|
④ | 位元組陣列的“非正式”值 | bytes(x) |
x.__bytes__() |
- 對
__init__()
方法的呼叫發生在例項被建立 之後 。如果要控制實際建立程序,請使用__new__()
方法。 - 按照約定,
__repr__()
方法所返回的字串為合法的 Python 表示式。 - 在呼叫
print(x)
的同時也呼叫了__str__()
方法。 - 由於
bytes
型別的引入而從 Python 3 開始出現。
行為方式與迭代器類似的類
序號 | 目的 | 所編寫程式碼 | Python 實際呼叫 |
---|---|---|---|
② | 從迭代器中獲取下一個值 | next(seq) |
- 無論何時建立迭代器都將呼叫
__iter__()
方法。這是用初始值對迭代器進行初始化的絕佳之處。 - 無論何時從迭代器中獲取下一個值都將呼叫
__next__()
方法。 __reversed__()
方法並不常用。它以一個現有序列為引數,並將該序列中所有元素從尾到頭以逆序排列生成一個新的迭代器。
計算屬性
- 如果某個類定義了
__getattribute__()
方法,在 每次引用屬性或方法名稱時 Python 都呼叫它(特殊方法名稱除外,因為那樣將會導致討厭的無限迴圈)。 - 如果某個類定義了
__getattr__()
方法,Python 將只在正常的位置查詢屬性時才會呼叫它。如果例項 x 定義了屬性color,x.color
將 不會 呼叫x.__getattr__('color')
;而只會返回x.color 已定義好的值。 - 無論何時給屬性賦值,都會呼叫
__setattr__()
方法。 - 無論何時刪除一個屬性,都將呼叫
__delattr__()
方法。 - 如果定義了
__getattr__()
或__getattribute__()
方法,__dir__()
方法將非常有用。通常,呼叫dir(x)
將只顯示正常的屬性和方法。如果__getattr()__
方法動態處理color 屬性,dir(x)
將不會將 color 列為可用屬性。可通過覆蓋__dir__()
方法允許將 color 列為可用屬性,對於想使用你的類但卻不想深入其內部的人來說,該方法非常有益。
相關推薦
python中那些雙下劃線開頭得函式和變數
Python 用下劃線作為變數字首和字尾指定特殊變數 _xxx 不能用’from module import *’匯入 __xxx__ 系統定義名字 __xxx 類中的私有變數名 核心風格:避免用下劃線作為變數名的開始。 因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避
Python中被雙下劃線包圍的魔法方法
按位異或 blog with pow ring 指定元素 運算 -c 描述 基本的魔法方法 __new__(cls[, ...]) 用來創建對象 1. __new__ 是在一個對象實例化的時候所調用的第一個方法 2. 它的第一個參數是這個類,其他的參數
python類中的雙下劃線方法
att 他還 ret sel col 只有一個 war span instance __getitem__,__setitem__和__delitem__ 實現了對象屬性的字典化操作。 class Person: def __init__(self, na
關於sqlalchemy中鍵值以雙下劃線開頭導致Unknown column錯誤的問題
在開發中遇到了一個奇葩的問題,設計的資料庫其中有Column以雙下劃線開頭,導致在執行中出現錯誤。現在以例子來複現並解決錯誤。首先建立資料表CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, __
類中以雙下劃線開始的方法
tin data .py docs track new 屬性 enc attr *參考:https://docs.python.org/2/reference/datamodel.html#special-method-names 一 經常使用: (1)__init
在vim中使用cscope查詢呼叫、定義函式和變數的地方
在vim中用了一陣子ctags,確實美中不足。ctags只能根據呼叫函式的地方查詢定義該函式的地方,不能根據定義函式的地方查詢都有哪些地方呼叫了 該函式。於是又學習了cscope。Cscope在主頁上說它具有毋庸置疑的UNIX血統,早在PDP-11的時代就已經在貝爾實驗室開發出來了。我的 Linux是S
python(七) Python中單下劃線和雙下劃線
www www. 自己 pro improt 分類 鏈接 默認 question Python中單下劃線和雙下劃線: 一、分類 (1)、以單下劃線開頭,表示這是一個保護成員,只有類對象和子類對象自己能訪問到這些變量。 以單下劃線開
Python中單下劃線和雙下劃線有啥區別
__func__:一種約定,Python內部的名字,用來區別其他使用者自定義的命名,以防衝突。 _func: 一種約定,用來指定私有變數或私有函式(private) __func: 如果類中有一個方法與另外一個類中的一個方法同名了
Python類中的單下劃線和雙下劃線的區別
#"單下劃線" 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數; #"雙下劃線" 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到 #-*-coding:utf8-*- class father(): def __init
Python中單、雙下劃線的區別總結
前言 Python 的程式碼風格由 PEP 8 描述。這個文件描述了 Python 程式設計風格的方方面面。在遵守這個文件的條件下,不同程式設計師編寫的 Python 程式碼可以保持最大程度的相似風格。這樣就易於閱讀,易於在程式設計師之間交流。 我們大家在學習Python的時候,好像
Python中帶下劃線或者雙下劃線的屬性使用。
以單下劃線開頭,表示這是一個保護成員,只有類物件和子類物件自己能訪問到這些變數。以單下劃線開頭的變數和函式被預設是內部函式,使用from module import *時不會被獲取,但是使用import module可以獲取。 以單下劃線結尾僅僅是為了區別該名稱與關鍵詞 雙下劃線開頭,表示為私有成員,只允
理解Python的雙下劃線命名(轉)
函數 python的函數 del 標準 開頭 變量名 cnblogs 通過 全局 add by zhj:今天在學習SimpleHTTPServer的源代碼時,看到了Python標準庫SocketServer模塊中有個BaseServer類,該類的__init__方法定義如下
python-day71--django多表雙下劃線查詢及分組聚合
cts 劃線 django del 就是 auth 分組聚合 with 沒有 #====================================雙下劃線的跨表查詢===============# 前提 此時 related_name=bookList 屬性
python 單下劃線和雙下劃線
base print 定義 gpo pass erl spa ble ... 1 underline.py 2 __all__ = [‘_underline_variable‘, ‘__underline_variable‘, ‘_underline_func‘,
理解Python的雙下劃線命名
public bject () 有變 weakref _weak 令行 方法 全部 引子 我熱情地邀請大家猜測下面這段程序的輸出: class A(object): def __init__(self): self.__priva
python的單下劃線和雙下劃線
python 類中的單下劃線開頭的變量表示:該方法為類的私有方法,原則上外部不能訪問,但是用._XX是可以訪問到的 雙下劃線開頭則是強制外部不能直接訪問的用.__XX是訪問不到的,它內部其實是將變數名重新命名為:_類名__變數名,所以可以通過._類名__變數名訪問 #_*_coding:utf-8_
(轉)python 全棧開發,Day74(基於雙下劃線的跨表查詢,聚合查詢,分組查詢,F查詢,Q查詢)
昨日內容回顧 # 一對多的新增方式1(推薦) # book=Book.objects.create(title="水滸傳",price=100,pub_date="1643-4-12",publish_id=1) # print(book.title) # 一對多的新增
Python 私有變數中兩個下劃線 _ _item 與 一個下劃線的區別 _item
python中沒有常量的說法, 但是可以通過元組實現一個常量 在python的私有變數中, 存在兩個下劃線 _ _item 與一個下劃線 _item 的區別 前面帶兩個下劃線的私有變數: 只能在本類中進行內部呼叫, 例項物件和子類都不可以進行呼叫 前面帶一個下劃線的私有變
python 裡面的單下劃線與雙下劃線的區別
Python 用下劃線作為變數字首和字尾指定特殊變數。 _xxx 不能用’from moduleimport *'匯入 xxx 系統定義名字 __xxx 類中的私有變數名 核心風格:避免用下劃線作為變數名的開始。 因為下劃線對直譯器有特殊的意義,而且是內建識別符號所
python 單下劃線/雙下劃線使用總結
Python 用下劃線作為變數字首和字尾指定特殊變數/方法。 主要存在四種情形 1. 1. object # public 2. __object__ # special, python system use, user should not define like it 3. __o