byteofpython.info_byteofpython学习笔记(2)
8.面向對象的編程
類使用class關鍵字創建。類的域和方法被列在一個縮進塊中。
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不為這個參數賦值,Python會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是self。
你一定很奇怪Python如何給self賦值以及為何你不需要給它賦值。舉一個例子會使此變得清晰。假如你有一個類稱為MyClass和這個類的一個實例MyObject。當你調用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉為MyClass.method(MyObject, arg1,arg2)——這就是self的原理了。
類名后跟一對圓括號來創建一個對象/實例
__init__方法在類的一個對象被建立時,馬上運行。這個方法可以用來對你的對象做一些你希望的初始化。注意,這個名稱的開始和結尾都是雙下劃線。
有兩種類型的域 ——類的變量和對象的變量,它們根據是類還是對象擁有這個變量而區分。
最重要的是,我們沒有專門調用__init__方法,只是在創建一個類的新實例的時候,把參數包括在圓括號內跟在類名后面,從而傳遞給__init__方法。這是這種方法的重要之處。
類的變量 由一個類的所有對象(實例)共享使用。只有一個類變量的拷貝,所以當某個對象對類的變量做了改動的時候,這個改動會反映到所有其他的實例上。
對象的變量 由類的每個對象/實例擁有。因此每個對象有自己對這個域的一份拷貝,即它們不是共享的,在同一個類的不同實例中,雖然對象的變量有相同的名稱,但是是互不相關的
一個特殊的方法__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 "", line 1, in ?
AssertionError
repr函數用來取得對象的規范字符串表示。反引號(也稱轉換符)可以完成相同的功能。注
意,在大多數時候有eval(repr(object)) == object。
>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"
基本上,repr函數和反引號用來獲取對象的可打印的表示形式。你可以通過定義類的__repr__方法來控制你的對象在被repr函數調用的時候返回的內容。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的byteofpython.info_byteofpython学习笔记(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ppct各代表什么_高瓷、瓷釉、玉化,三
- 下一篇: mvvm模式和mvc的区别_被误解的 M