天天看點

byteofpython學習筆記(2)

8.面向對象的程式設計

類使用class關鍵字建立。類的域和方法被列在一個縮進塊中。

類的方法與普通的函數隻有一個特别的差別——它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不為這個參數指派,Python會提供這個值。這個特别的變量指對象本身,按照慣例它的名稱是self。

你一定很奇怪Python如何給self指派以及為何你不需要給它指派。舉一個例子會使此變得清晰。假如你有一個類稱為MyClass和這個類的一個執行個體MyObject。當你調用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉為MyClass.method(MyObject, arg1,arg2)——這就是self的原理了。

類名後跟一對圓括号來建立一個對象/執行個體

<b>__init__</b><b>方法在類的一個對象被建立時,馬上運作。這個方法可以用來對你的對象做一些你希望的 </b><b>初始化 </b><b>。注意,這個名稱的開始和結尾都是雙下劃線。</b>

有兩種類型的域 ——類的變量和對象的變量,它們根據是類還是對象擁有這個變量而區分。

最重要的是,我們沒有專門調用__init__方法,隻是在建立一個類的新執行個體的時候,把參數包括在圓括号内跟在類名後面,進而傳遞給__init__方法。這是這種方法的重要之處。

類的變量 由一個類的所有對象(執行個體)共享使用。隻有一個類變量的拷貝,是以當某個對象對類的變量做了改動的時候,這個改動會反映到所有其他的執行個體上。

對象的變量 由類的每個對象/執行個體擁有。是以每個對象有自己對這個域的一份拷貝,即它們不是共享的,在同一個類的不同執行個體中,雖然對象的變量有相同的名稱,但是是互不相關的

一個特殊的方法__del__,它在對象消逝的時候被調用。對象消逝即對象不再被使用,它所占用的記憶體将傳回給系統作它用

<b>當對象不再被使用時,__del__</b><b>方法運作,但是很難保證這個方法究竟在 </b><b>什麼時候 </b><b>運作。如果你想要指明它的運作,你就得使用del</b><b>語句,</b>

給C++/Java/C#程式員的注釋

Python中所有的類成員(包括資料成員)都是 公共的 ,所有的方法都是 有效的 。

隻有一個例外:<b>如果你使用的資料成員名稱以</b><b> </b><b>雙下劃線字首 </b><b>比如__privatevar</b><b>,Python</b><b>的名稱管理體系會有效地把它作為私有變量。</b>

這樣就有一個慣例,如果某個變量隻想在類或對象中使用,就應該以單下劃線字首。而其他的名稱都将作為公共的,可以被其他類/對象使用。記住這隻是一個慣例,并不是Python所要求的(與雙下劃線字首不同)。

同樣,注意__del__方法與 destructor 的概念類似。

隻有一個例外:如果你使用的資料成員名稱以 雙下劃線字首 比如__privatevar,Python的名稱管理體系會有效地把它作為私有變量。

<b>Python</b><b>不會自動調用基本類的constructor</b><b>,你得親自專門調用它</b>

9.輸入/輸出

你可以通過建立一個file類的對象來打開一個檔案,分别使用file類的read、readline或write方法來恰當地讀寫檔案。對檔案的讀寫能力依賴于你在打開檔案時指定的模式。最後,當你完成對檔案的操作的時候,你調用close方法來告訴Python我們完成了對檔案的使用。

首先,我們通過指明我們希望打開的檔案和模式來建立一個file類的執行個體。模式可以為讀模式('r')、寫模式('w')或追加模式('a')。事實上還有多得多的模式可以使用,你可以使用help(file)來了解它們的詳情。

在一個循環中,我們使用readline方法讀檔案的每一行。<b>這個方法傳回包括行末換行符</b>

<b>的一個完整行。</b>

<b>Python</b><b>提供一個标準的子產品,稱為pickle</b><b>。使用它你可以在一個檔案中儲存任何Python</b><b>對象,之後你又可以把它完整無缺地取出來。這被稱為 </b><b>持久地儲存對象。</b>

還有另一個子產品稱為cPickle,它的功能和pickle子產品完全相同,隻不過它是用C語言編寫的,是以要快得多(比pickle快1000倍)。你可以使用它們中的任一個,而我們在這裡将使用cPickle子產品。記住,我們把這兩個子產品都簡稱為pickle子產品。

10.異常

我們可以使用try..except語句來處理異常。我們把通常的語句放在try-塊中,而把我們的錯誤處理語句放在except-塊中。

對于每個try從句,至少都有一個相關聯的except從句。

你還可以讓try..except塊關聯上一個else從句。<b>當沒有異常發生的時候,</b><b>else</b><b>從句将被執行。</b>

假如你在讀一個檔案的時候,希望在無論異常發生與否的情況下都關閉檔案,該怎麼做呢?這可以使用finally塊來完成。<b>注意,在一個</b><b>try</b><b>塊下,你可以同時使用except</b><b>從句和finally</b><b>塊。如果你要同時使用它們的話,需要把一個嵌入另外一個。</b>

11.Python标準庫

sys.version字元串給你提供安裝的Python的版本資訊。sys.version_info元組則提供一個更簡單的方法來使你的程式具備Python版本要求功能。

對于有經驗的程式員,sys子產品中其他令人感興趣的項目有sys.stdin、sys.stdout和sys.stderr它們分别對應你的程式的标準輸入、标準輸出和标準錯誤流。

sys.exit函數退出正在運作的

<b>os</b><b>子產品</b>

這個子產品包含普遍的作業系統功能。如果你希望你的程式能夠與平台無關的話,這個子產品是尤為重要的。即它允許一個程式在編寫後不需要任何改動,也不會發生任何問題,就可以在

Linux和Windows下運作。一個例子就是使用os.sep可以取代作業系統特定的路徑分割符。

下面列出了一些在os子產品中比較有用的部分。它們中的大多數都簡單明了。

● os.name字元串訓示你正在使用的平台。比如對于Windows,它是'nt',而對于Linux/Unix

使用者,它是'posix'。

● os.getcwd()函數得到目前工作目錄,即目前Python腳本工作的目錄路徑。

● os.getenv()和os.putenv()函數分别用來讀取和設定環境變量。

<b>●</b><b> os.listdir()</b><b>傳回指定目錄下的所有檔案和目錄名。</b>

<b>●</b><b> os.remove()</b><b>函數用來删除一個檔案。</b>

<b>●</b><b> os.system()</b><b>函數用來運作shell</b><b>指令。</b>

● os.linesep字元串給出目前平台使用的行終止符。例如,Windows使用'\r\n',Linux使

用'\n'而Mac使用'\r'。

● os.path.split()函數傳回一個路徑的目錄名和檔案名。

&gt;&gt;&gt; os.path.split('/home/swaroop/byte/code/poem.txt')

('/home/swaroop/byte/code', 'poem.txt')

● os.path.isfile()和os.path.isdir()函數分别檢驗給出的路徑是一個檔案還是目錄。

類似地,os.path.exists()函數用來檢驗給出的路徑是否真地存在。

表15.1 一些特殊的方法

名稱說明

__init__(self,...) 這個方法在建立對象恰好要被傳回使用之前被調用。

__del__(self) 恰好在對象要被删除之前調用。

__str__(self) 在我們對對象使用print語句或是使用str()的時候調用。

__lt__(self,other)當使用 小于 運算符(&lt;)的時候調用。類似地,對于所有的運算符(+,&gt;等等)都有特殊的方法。

__getitem__(self,key)使用x[key]索引操作符的時候調用。

__len__(self) 對序列對象使用内建的len()函數的時候調用。

通過清單綜合,可以從一個已有的清單導出一個新的清單。例如,你有一個數的清單,而你想要得到一個對應的清單,使其中所有大于2的數都是原來的2倍。對于這種應用,清單綜合是最理想的方法。

listone = [2, 3, 4]

<b>listtwo = [2*i for i in listone if i &gt; 2]</b>

print listtwo

<b>在函數中接收元組和清單</b>

當要使函數接收元組或字典形式的參數的時候,有一種特殊的方法,它分别使用*和**字首。

這種方法在函數需要擷取可變數量的參數的時候特别有用。

def powersum(power, *args):

... '''Return the sum of each argument raised to specified power.'''

... total = 0

... for i in args:

... total += pow(i, power)

... return total

...

&gt;&gt;&gt; powersum(2, 3, 4)

25

&gt;&gt;&gt; powersum(2, 10)

100

<b>由于在args</b><b>變量前有*</b><b>字首,所有多餘的函數參數都會作為一個元組存儲在args</b><b>中。如果使用的是**</b><b>字首,多餘的參數則會被認為是一個字典的鍵/</b><b>值對</b><b>。</b>

exec語句用來執行儲存在字元串或檔案中的Python語句。例如,我們可以在運作時生成一個包含Python代碼的字元串,然後使用exec語句執行這些語句。下面是一個簡單的例子。

&gt;&gt;&gt; exec 'print "Hello World"'

Hello World

eval語句用來計算存儲在字元串中的有效Python表達式。下面是一個簡單的例子。

&gt;&gt;&gt; eval('2*3')

6

assert語句用來聲明某個條件是真的。例如,如果你非常确信某個你使用的清單中至少有一個元素,而你想要檢驗這一點,并且在它非真的時候引發一個錯誤,那麼assert語句是應用在這種情形下的理想語句。當assert語句失敗的時候,會引發一個AssertionError。

&gt;&gt;&gt; mylist = ['item']

&gt;&gt;&gt; assert len(mylist) &gt;= 1

&gt;&gt;&gt; mylist.pop()

'item'

Traceback (most recent call last):

File "&lt;stdin&gt;", line 1, in ?

AssertionError

repr函數用來取得對象的規範字元串表示。反引号(也稱轉換符)可以完成相同的功能。注

意,在大多數時候有eval(repr(object)) == object。

&gt;&gt;&gt; i = []

&gt;&gt;&gt; i.append('item')

&gt;&gt;&gt; `i`

"['item']"

&gt;&gt;&gt; repr(i)

基本上,repr函數和反引号用來擷取對象的可列印的表示形式。你可以通過定義類的__repr__方法來控制你的對象在被repr函數調用的時候傳回的内容。

本文轉自 yubowei 51CTO部落格,原文連結:http://blog.51cto.com/samyubw/625189