byteofpython學習筆記(2)

8.面向對象的編程程序員

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

類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱,可是在調用這個方法的時候你不爲這個參數賦值,Python會提供這個值。這個特別的變量指對象自己,按照慣例它的名稱是self。編程

你必定很奇怪Python如何給self賦值以及爲什麼你不須要給它賦值。舉一個例子會使此變得清晰。假如你有一個類稱爲MyClass和這個類的一個實例MyObject。當你調用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉爲MyClass.method(MyObject, arg1,arg2)——這就是self的原理了。app

類名後跟一對圓括號來建立一個對象/實例ide

__init__方法在類的一個對象被創建時,立刻運行。這個方法能夠用來對你的對象作一些你但願的 初始化 。注意,這個名稱的開始和結尾都是雙下劃線。函數

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

最重要的是,咱們沒有專門調用__init__方法,只是在建立一個類的新實例的時候,把參數包括在圓括號內跟在類名後面,從而傳遞給__init__方法。這是這種方法的重要之處。操作系統

類的變量 由一個類的全部對象(實例)共享使用。只有一個類變量的拷貝,因此當某個對象對類的變量作了改動的時候,這個改動會反映到全部其餘的實例上。code

對象的變量 由類的每一個對象/實例擁有。所以每一個對象有本身對這個域的一份拷貝,即它們不是共享的,在同一個類的不一樣實例中,雖然對象的變量有相同的名稱,可是是互不相關的對象

一個特殊的方法__del__,它在對象消逝的時候被調用。對象消逝即對象再也不被使用,它所佔用的內存將返回給系統做它用

當對象再也不被使用時,__del__方法運行,可是很難保證這個方法究竟在 何時 運行。若是你想要指明它的運行,你就得使用del語句,

給C++/Java/C#程序員的註釋

Python中全部的類成員(包括數據成員)都是 公共的 ,全部的方法都是 有效的 。

只有一個例外:若是你使用的數據成員名稱以 雙下劃線前綴 好比__privatevar,Python的名稱管理體系會有效地把它做爲私有變量。

這樣就有一個慣例,若是某個變量只想在類或對象中使用,就應該以單下劃線前綴。而其餘的名稱都將做爲公共的,能夠被其餘類/對象使用。記住這只是一個慣例,並非Python所要求的(與雙下劃線前綴不一樣)。

一樣,注意__del__方法與 destructor 的概念相似。

給C++/Java/C#程序員的註釋

Python中全部的類成員(包括數據成員)都是 公共的 ,全部的方法都是 有效的 。

只有一個例外:若是你使用的數據成員名稱以 雙下劃線前綴 好比__privatevar,Python的名稱管理體系會有效地把它做爲私有變量。

這樣就有一個慣例,若是某個變量只想在類或對象中使用,就應該以單下劃線前綴。而其餘的名稱都將做爲公共的,能夠被其餘類/對象使用。記住這只是一個慣例,並非Python所要求的(與雙下劃線前綴不一樣)。

一樣,注意__del__方法與 destructor 的概念相似。

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

9.輸入/輸出

你能夠經過建立一個file類的對象來打開一個文件,分別使用file類的read、readline或write方法來恰當地讀寫文件。對文件的讀寫能力依賴於你在打開文件時指定的模式。最後,當你完成對文件的操做的時候,你調用close方法來告訴Python咱們完成了對文件的使用。

首先,咱們經過指明咱們但願打開的文件和模式來建立一個file類的實例。模式能夠爲讀模式('r')、寫模式('w')或追加模式('a')。事實上還有多得多的模式可使用,你可使用help(file)來了解它們的詳情。

在一個循環中,咱們使用readline方法讀文件的每一行。這個方法返回包括行末換行符

的一個完整行。

 

Python提供一個標準的模塊,稱爲pickle。使用它你能夠在一個文件中儲存任何Python對象,以後你又能夠把它完好無損地取出來。這被稱爲 持久地儲存對象。

 

還有另外一個模塊稱爲cPickle,它的功能和pickle模塊徹底相同,只不過它是用C語言編寫的,所以要快得多(比pickle快1000倍)。你可使用它們中的任一個,而咱們在這裏將使用cPickle模塊。記住,咱們把這兩個模塊都簡稱爲pickle模塊。

10.異常

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

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

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

假如你在讀一個文件的時候,但願在不管異常發生與否的狀況下都關閉文件,該怎麼作呢?這可使用finally塊來完成。注意,在一個try塊下,你能夠同時使用except從句和finally塊。若是你要同時使用它們的話,須要把一個嵌入另一個。

11.Python標準庫

sys.version字符串給你提供安裝的Python的版本信息。sys.version_info元組則提供一個更簡單的方法來使你的程序具有Python版本要求功能。

對於有經驗的程序員,sys模塊中其餘使人感興趣的項目有sys.stdin、sys.stdout和sys.stderr它們分別對應你的程序的標準輸入、標準輸出和標準錯誤流。

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

os模塊

這個模塊包含廣泛的操做系統功能。若是你但願你的程序可以與平臺無關的話,這個模塊是尤其重要的。即它容許一個程序在編寫後不須要任何改動,也不會發生任何問題,就能夠在

Linux和Windows下運行。一個例子就是使用os.sep能夠取代操做系統特定的路徑分割符。

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

● os.name字符串指示你正在使用的平臺。好比對於Windows,它是'nt',而對於Linux/Unix

用戶,它是'posix'。

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

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

os.listdir()返回指定目錄下的全部文件和目錄名。

os.remove()函數用來刪除一個文件。

os.system()函數用來運行shell命令。

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

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

● os.path.split()函數返回一個路徑的目錄名和文件名。

>>> 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)當使用 小於 運算符(<)的時候調用。相似地,對於全部的運算符(+,>等等)都有特殊的方法。

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

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

經過列表綜合,能夠從一個已有的列表導出一個新的列表。例如,你有一個數的列表,而你想要獲得一個對應的列表,使其中全部大於2的數都是原來的2倍。對於這種應用,列表綜合是最理想的方法。

listone = [2, 3, 4]

listtwo = [2*i for i in listone if i > 2]

print listtwo

在函數中接收元組和列表

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

這種方法在函數須要獲取可變數量的參數的時候特別有用。

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

...

>>> powersum(2, 3, 4)

25

>>> powersum(2, 10)

100

因爲在args變量前有*前綴,全部多餘的函數參數都會做爲一個元組存儲在args中。若是使用的是**前綴,多餘的參數則會被認爲是一個字典的鍵/值對

exec語句用來執行儲存在字符串或文件中的Python語句。例如,咱們能夠在運行時生成一個包含Python代碼的字符串,而後使用exec語句執行這些語句。下面是一個簡單的例子。

>>> exec 'print "Hello World"'

Hello World

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

>>> eval('2*3')

6

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

>>> mylist = ['item']

>>> assert len(mylist) >= 1

>>> mylist.pop()

'item'

>>> assert len(mylist) >= 1

Traceback (most recent call last):

File "<stdin>", line 1, in ?

AssertionError

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

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

>>> i = []

>>> i.append('item')

>>> `i`

"['item']"

>>> repr(i)

"['item']"

基本上,repr函數和反引號用來獲取對象的可打印的表示形式。你能夠經過定義類的__repr__方法來控制你的對象在被repr函數調用的時候返回的內容。

相關文章
相關標籤/搜索