python 中變數的命名規範

来源:http://www.cnblogs.com/Maker-Liu/archive/2016/05/25/5528213.html
-Advertisement-
Play Games

出自:http://www.diybl.com/course/3_program/python/20111130/563643.html 模塊名: 小寫字母,單詞之間用_分割 ad_stats.py 包名: 和模塊名一樣 類名: 單詞首字母大寫 AdStats ConfigUtil 全局變數名(類變 ...


出自:http://www.diybl.com/course/3_program/python/20111130/563643.html 
模塊名: 
小寫字母,單詞之間用_分割 
ad_stats.py 

包名: 
和模塊名一樣 

類名: 
單詞首字母大寫 
AdStats 
ConfigUtil 

全局變數名(類變數,在java中相當於static變數): 
大寫字母,單詞之間用_分割 
NUMBER 
COLOR_WRITE 

普通變數: 
小寫字母,單詞之間用_分割 
this_is_a_var 

實例變數: 
以_開頭,其他和普通變數一樣 
_price    
_instance_var 

私有實例變數(外部訪問會報錯): 
以__開頭(2個下劃線),其他和普通變數一樣 
__private_var 

專有變數: 
__開頭,__結尾,一般為python的自有變數,不要以這種方式命名 
__doc__ 
__class__ 

普通函數: 
和普通變數一樣: 
get_name() 
count_number() 
ad_stat() 

私有函數(外部訪問會報錯): 
以__開頭(2個下劃線),其他和普通函數一樣 
__get_name() 
————————————————————————————————————————————————————————————————————
文件名 
全小寫,可使用下劃線 
包 
應該是簡短的、小寫的名字。如果下劃線可以改善可讀性可以加入。如mypackage。 
模塊 
與包的規範同。如mymodule。 
類 
總是使用首字母大寫單詞串。如MyClass。內部類可以使用額外的前導下劃線。 

函數&方法 
函數名應該為小寫,可以用下劃線風格單詞以增加可讀性。如:myfunction,my_example_function。 
*註意*:混合大小寫僅被允許用於這種風格已經占據優勢的時候,以便保持向後相容。 
函數和方法的參數 
總使用“self”作為實例方法的第一個參數。總使用“cls”作為類方法的第一個參數。 
如果一個函數的參數名稱和保留的關鍵字衝突,通常使用一個尾碼下劃線好於使用縮寫或奇怪的拼寫。 
全局變數 
對於from M import *導入語句,如果想阻止導入模塊內的全局變數可以使用舊有的規範,在全局變數上加一個前導的下劃線。 
*註意*:應避免使用全局變數 
變數 
變數名全部小寫,由下劃線連接各個單詞。如color = WHITE,this_is_a_variable = 1 
*註意*: 
1.不論是類成員變數還是全局變數,均不使用 m 或 g 首碼。 
2.私有類成員使用單一下劃線首碼標識,多定義公開成員,少定義私有成員。 
3.變數名不應帶有類型信息,因為Python是動態類型語言。如 iValue、names_list、dict_obj 等都是不好的命名。 
常量 
常量名所有字母大寫,由下劃線連接各個單詞如MAX_OVERFLOW,TOTAL。 
異常 
以“Error”作為尾碼。 
縮寫 
命名應當儘量使用全拼寫的單詞,縮寫的情況有如下兩種: 
1.常用的縮寫,如XML、ID等,在命名時也應只大寫首字母,如XmlParser。 
2.命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式。 
例如: 
function 縮寫為 fn 
text 縮寫為 txt 
object 縮寫為 obj 
count 縮寫為 cnt 
number 縮寫為 num,等。 
前導尾碼下劃線 
一個前導下劃線:表示非公有。 
一個尾碼下劃線:避免關鍵字衝突。 
兩個前導下劃線:當命名一個類屬性引起名稱衝突時使用。 
兩個前導和尾碼下劃線:“魔”(有特殊用途)對象或者屬性,例如__init__或者__file__。絕對不要創造這樣的名字,而只是使用它們。 
*註意*:關於下劃線的使用存在一些爭議。 
Python 用下劃線作為變數首碼和尾碼指定特殊變數。 

_xxx      不能用'from module import *'導入 
__xxx__ 系統定義名字 
__xxx    類中的私有變數名 

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

因為下劃線對解釋器有特殊的意義,而且是內建標識符所使用的符號,我們建議程式員避免用下劃線作為變數名的開始。一般來講,變數名_xxx被看作是“私有的”,在模塊或類外不可以使用。當變數是私有的時候,用_xxx 來表示變數是很好的習慣。因為變數名__xxx__對Python 來說刑厥夂澹雜諂脹ǖ謀淞坑Φ北苊庹庵置綹瘛?br> 
"單下劃線" 開始的成員變數叫做保護變數,意思是只有類對象和子類對象自己能訪問到這些變數; 
"雙下劃線" 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。 

以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用“from xxx import *”而導入;以雙下劃線開頭的(__foo)代表類的私有成員;以雙下劃線開頭和結尾的(__foo__)代表python里特殊方法專用的標識,如 __init__()代表類的構造函數。 
特定命名方式 
主要是指 __xxx__ 形式的系統保留字命名法。項目中也可以使用這種命名,它的意義在於這種形式的變數是只讀的,這種形式的類成員函數儘量不要重載。如 
class Base(object): 
def __init__(self, id, parent = None): 
self.__id__ = id 
self.__parent__ = parent 
def __message__(self, msgid): 
# …略 
其中 __id__、__parent__ 和 __message__ 都採用了系統保留字命名法。 
附:Google Python命名規範 
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name. 
————————————————————————————————————————————————————————
from:http://hi.baidu.com/kxw102/blog/item/212e9f3859202fe33b87ce4b.html 
理解Python命名機制 

引子 
我熱情地邀請大家猜測下麵這段程式的輸出: 
class A(object): 
       def __init__(self): 
              self.__private() 
              self.public() 
       def __private(self): 
              print 'A.__private()' 
       def public(self): 
              print 'A.public()' 
class B(A): 
       def __private(self): 
              print 'B.__private()' 
       def public(self): 
              print 'B.public()' 
b = B() 

初探 
正確的答案是: 
A.__private() 
B.public() 
如果您已經猜對了,那麼可以不看我這篇博文了。如果你沒有猜對或者心裡有所疑問,那我的這篇博文正是為您所準備的。 
一切由為什麼會輸出“A.__private()”開始。但要講清楚為什麼,我們就有必要瞭解一下Python的命名機制。 
據 Python manual,變數名(標識符)是Python的一種原子元素。當變數名被綁定到一個對象的時候,變數名就指代這個對象,就像人類社會一樣,不是嗎?當變 量名出現在代碼塊中,那它就是本地變數;當變數名出現在模塊中,它就是全局變數。模塊相信大家都有很好的理解,但代碼塊可能讓人費解些。在這裡解釋一下: 
代碼塊就是可作為可執行單元的一段Python程式文本;模塊、函數體和類定義都是代碼塊。不僅如此,每一個交互腳本命令也是一個代碼塊;一個腳本文件也是一個代碼塊;一個命令行腳本也是一個代碼塊。 
接 下來談談變數的可見性,我們引入一個範圍的概念。範圍就是變數名在代碼塊的可見性。如果一個代碼塊里定義本地變數,那範圍就包括這個代碼塊。如果變數定義 在一個功能代碼塊里,那範圍就擴展到這個功能塊里的任一代碼塊,除非其中定義了同名的另一變數。但定義在類中的變數的範圍被限定在類代碼塊,而不會擴展到 方法代碼塊中。 

迷蹤 
據上節的理論,我們可以把代碼分為三個代碼塊:類A的定義、類B的定義和變數b的定義。根據類定義,我們知道代碼給類A定義了三個成員變數(Python的函數也是對象,所以成員方法稱為成員變數也行得通。);類B定義了兩個成員變數。這可以通過以下代碼驗證: 
>>> print '\n'.join(dir(A)) 
_A__private 
__init__ 
public 
>>> print '\n'.join(dir(B)) 
_A__private 
_B__private 
__init__ 
public 
咦,為什麼類A有個名為_A__private的 Attribute 呢?而且__private消失了!這就要談談Python的私有變數軋壓了。 

探究 
懂 Python的朋友都知道Python把以兩個或以上下劃線字元開頭且沒有以兩個或以上下劃線結尾的變數當作私有變數。私有變數會在代碼生成之前被轉換為 長格式(變為公有)。轉換機制是這樣的:在變數前端插入類名,再在前端加入一個下劃線字元。這就是所謂的私有變數軋壓(Private name mangling)。如類A里的__private標識符將被轉換為_A__private,這就是上一節出現_A__private和 __private消失的原因了。 
再講兩點題外話: 
一是因為軋壓會使標識符變長,當超過255的時候,Python會切斷,要註意因此引起的命名衝突。 
二是當類名全部以下劃線命名的時候,Python就不再執行軋壓。如: 
>>> class ____(object): 
       def __init__(self): 
              self.__method() 
       def __method(self): 
              print '____.__method()' 
>>> print '\n'.join(dir(____)) 
__class__ 
__delattr__ 
__dict__ 
__doc__ 
__getattribute__ 
__hash__ 
__init__ 
__method              # 沒被軋壓 
__module__ 
__new__ 
__reduce__ 
__reduce_ex__ 
__repr__ 
__setattr__ 
__str__ 
__weakref__ 
>>> obj = ____() 
____.__method() 
>>> obj.__method()      # 可以外部調用 
____.__method() 
現在我們回過頭來看看為什麼會輸出“A.__private()”吧! 

真相 
相信現在聰明的讀者已經猜到答案了吧?如果你還沒有想到,我給你個提示:真相跟C語言里的巨集預處理差不多。 
因為類A定義了一個私有成員函數(變數),所以在代碼生成之前先執行私有變數軋壓(註意到上一節標紅的那行字沒有?)。軋壓之後,類A的代碼就變成這樣了: 
class A(object): 
       def __init__(self): 
              self._A__private()          # 這行變了 
              self.public() 
       def _A__private(self):           # 這行也變了 
              print 'A.__private()' 
       def public(self): 
              print 'A.public()' 
是不是有點像C語言里的巨集展開啊? 
因為在類B定義的時候沒有覆蓋__init__方法,所以調用的仍然是A.__init__,即執行了self._A__private(),自然輸出“A.__private()”了。 
下麵的兩段代碼可以增加說服力,增進理解: 
>>> class C(A): 
       def __init__(self):          # 重寫__init__,不再調用self._A__private 
              self.__private()       # 這裡綁定的是_C_private 
              self.public() 
       def __private(self): 
              print 'C.__private()' 
       def public(self): 
              print 'C.public()' 
>>> c = C() 
C.__private() 
C.public() 
############################ 
>>> class A(object): 
       def __init__(self): 
              self._A__private()   # 調用一個沒有定義的函數,Python會把它給我的 ^_^~ 
              self.public() 
       def __private(self): 
              print 'A.__private()' 
       def public(self): 
              print 'A.public()' 
>>>a = A() 
A.__private() 
A.public() 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面基本介紹了下SpringMVC的運行原理,現在按照前面的原理一步步實現一個簡單的程式。先搭建一個簡單的web工程,將spring的jar包導入項目中。 前端控制器配置 在web.xml中配置如下: load-on-startup:表示servlet隨服務啟動; url-pattern:*.act ...
  • 主要的問題都記錄在Stack overflow上面。 因為百度,谷歌都沒有找到合適的解決辦法所以只好在上邊咨詢一下。最後自己找到的解決辦法就是替換selenium Jar為最新的版本。 http://stackoverflow.com/questions/37420917/build-errors- ...
  • 摘要:Python,windows安裝 1、進入python的官方網站下載:https://www.python.org 點擊Download,選擇windows版本: 2、下載完成後,點擊運行,直接下一步,直到Finish 3、安裝完成後,在開始菜單-->程式 >附件中啟動命令提示符(快捷鍵:WI ...
  • ...
  • PHP 支持八種原始類型(type)。 四種標量類型: 兩種複合類型: 兩種特殊類型: 字元串類型 一個字元串是一串字元的序列,就像 "Hello world!"。 定義字元串有 3 種方法: 1.單引號定義 將字元串用單引號(')括起來是定義字元串最簡單的方法: 如果字元串中有單引號,那麼需要使用 ...
  • Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space fo ...
  • Given an array and a value, remove all instances of that value in place and return the new length. Do not allocate extra space for another array, you ...
  • Day 15 集合框架01 TreeSet02 TreeSet存儲自定義對象03 二叉樹04 實現Comparator方式排序05 TreeSet練習06 泛型概述07 泛型使用08 泛型類09 泛型方法10 靜態方法泛型11 泛型介面12 泛型限定13 泛型限定2 01 TreeSet |--Se ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...