1. 程式人生 > >python中那些雙下劃線開頭得函式和變數

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__()
  1. __init__() 方法的呼叫發生在例項被建立 之後 。如果要控制實際建立程序,請使用 __new__() 方法
  2. 按照約定, __repr__() 方法所返回的字串為合法的 Python 表示式。
  3. 在呼叫 print(x) 的同時也呼叫了 __str__() 方法。
  4. 由於 bytes 型別的引入而從 Python 3 開始出現

行為方式與迭代器類似的類

序號 目的 所編寫程式碼 Python 實際呼叫
從迭代器中獲取下一個值 next(seq)
  1. 無論何時建立迭代器都將呼叫 __iter__() 方法。這是用初始值對迭代器進行初始化的絕佳之處。
  2. 無論何時從迭代器中獲取下一個值都將呼叫 __next__() 方法。
  3. __reversed__() 方法並不常用。它以一個現有序列為引數,並將該序列中所有元素從尾到頭以逆序排列生成一個新的迭代器。

計算屬性

  1. 如果某個類定義了 __getattribute__() 方法,在 每次引用屬性或方法名稱時 Python 都呼叫它(特殊方法名稱除外,因為那樣將會導致討厭的無限迴圈)。
  2. 如果某個類定義了 __getattr__() 方法,Python 將只在正常的位置查詢屬性時才會呼叫它。如果例項 x 定義了屬性colorx.color不會 呼叫x.__getattr__('color');而只會返回x.color 已定義好的值。
  3. 無論何時給屬性賦值,都會呼叫 __setattr__() 方法。
  4. 無論何時刪除一個屬性,都將呼叫 __delattr__() 方法。
  5. 如果定義了 __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