1. 程式人生 > >python中關於下劃線的整理

python中關於下劃線的整理

最近在學習python,發現python的變數命名很有意思,尤其是加入下劃線之後,作為一個準程式設計師,良好的程式碼規法一定要有,所以花時間找了一些資料,整理了一下。

首先,直接上結論:

Python 用下劃線作為變數字首和字尾指定特殊變數

_xxx 不能用’from module import *’匯入
_xxx_ 系統定義名字
__xxx 類中的私有變數名

所以Python的核心風格有一條:避免用下劃線作為變數名的開始。

一、具體說明:

  因為下劃線對直譯器有特殊的意義,而且是內建識別符號所使用的符號,我們建議程式設計師避免用下劃線作為變數名的開始。一般來講,變數名_xxx被看作是“私有 的”,在模組或類外不可以使用。當變數是私有的時候,用_xxx 來表示變數是很好的習慣。因為變數名__xxx__對Python 來說有特殊含義,對於普通的變數應當避免這種命名風格。

  “單下劃線” 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數;
  “雙下劃線” 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到這個資料。

   以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用“from xxx import *”而匯入;
   正如Python文件中所述:以下劃線“_”為字首的名稱(如_spam)應該被視為API中非公開的部分(不管是函式、方法還是資料成員)。此時,應該將它們看作是一種實現細節,在修改它們時無需對外部通知。

  以雙下劃線(__)開頭的用法並不是一種慣例,對直譯器來說它有特定的意義。Python中的這種用法是為了避免與子類定義的名稱衝突。
  Python文件指出:“__spam”這種形式(至少兩個前導下劃線,最多一個後續下劃線)的任何識別符號將會被“_classname__spam”這種形式原文取代,在這裡“classname”是去掉前導下劃線的當前類名。

   以雙下劃線開頭和結尾的(__foo__)代表python裡特殊方法專用的標識,如 __init__()代表類的建構函式。
   這種用法表示Python中特殊的方法名。其實,這只是一種慣例,對Python系統來說,這將確保不會與使用者自定義的名稱衝突。通常,你將會覆寫這些方法,並在裡面實現你所需要的功能,以便Python呼叫它們。例如,當定義一個類時,你經常會覆寫“__init__”方法。

二、應用示例

  1. 丟棄不必要的變數名
for i in range(6):
        #do something

這裡的變數 i 並沒有實際意義,所以可以用下劃線_來代替。

當你遇到一個不得不定義卻又沒有實際意義的變數時,都應該用下劃線”-“來代替,用於提高程式碼的可維護性。

2.使一個變數變成私有變數
這裡的下劃線“-”和Java裡的private有一樣的功能,如果一個變數或函式以__(兩個下畫線“-”)開頭,則表示這個變數或函式只能在此類或此模組中被訪問

3.保護父類中的方法不會被重寫

class A():  
    def __say_hello
(self):
print "hello from A" class B(A): def __say_hello(self): print "hello from B" a = A() b = B() print dir(a), dir(b) print b._A__say_hello(), b._B__say_hello() /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/xxx/PycharmProjects/untitled/b.py ['_A__say_hello'
, '__doc__', '__module__'] ['_A__say_hello', '_B__say_hello', '__doc__', '__module__'] hello from A None hello from B None Process finished with exit code 0

從上面的例子中可以看出子類B沒有重寫父類A中的_say_hello()方法是因為類中以‘兩個下劃線–’開頭的方法會被Python自動替換為[class_name][method_name]的形式,在外部不能用方法名直接呼叫這些方法,相當於類中的私有方法。

三、一些python系統保留定義的方法和屬性

1、 python的內部保留屬性:

這裡寫圖片描述

2、 python的保留方法:
見文章:Python的保留方法