
第十三章面向物件編程
在 Python 中,面向物件編程主要有兩個主題,就是類和類實體,
利用 class 關鍵字創建一個類:
class MyNewObjectType(bases): #bases 引數用于繼承的父類
‘define MyNewObjectType class’
Class_suite
object 是“所有類之母”,若未指明父類,則object 將作為默認的父類,
創建一個實體的語法:(注意:沒有使用 new,Python 根本就沒有 new 這個關鍵字)
myFirstObject = MyNewObjectType()
添加類方法:
class MyDataWithMethod(object): #定義類
def printFoo(self): #定義方法
print ‘You invoked printFoo()’
你可能注意到 self 引數,它在所有的方法宣告中都存在,并且必須是第一個引數,這個引數代表實體物件本身,當你呼叫方法的時候由解釋器悄悄地傳遞給方法,而不需要你自己傳遞 self,
init ()方法:類似于一個構造器,但不能說是一個構造器(因為 Python 沒有使用
new),它在創建一個新的物件時被呼叫,完成一個初始化作業,
類、屬性和方法的命名方式:
類:通常大寫字母打頭,這是標準慣例,有助于識別類,屬性:小寫字母打頭+ 駝峰,使用名詞作為名字,
方法:小寫字母打頭+ 駝峰,使用謂詞作為名字,
在 Python 中,宣告與定義類是沒有什么區別的,因為它們是同時進行的,定義(類體) 緊跟在宣告(含class 關鍵字的頭行)和可選(但總是推薦)的檔案字串后面,
Python 不支持純虛函式(如 C++)或抽象方法(如 Java),
Python 嚴格要求,沒有實體,方法是不能被呼叫的,方法必須系結(到一個實體)才能被直接呼叫,
dir(class_name): 回傳類物件的屬性的一個名字串列
class_name. dict
: 回傳的是一個字典,key 是屬性名,value 是資料值
init ()方法不應該回傳任何物件,即,它應該回傳 None,否則將產生 TypeError,
實體屬性 VS 類屬性:
類屬性跟實體無關,這些值像靜態成員那樣被參考,即使在多次實體化中呼叫類, 類屬性的值都不會改變,
子類可以通過繼承覆寫父類的方法,類似,如果在子類中覆寫了了 init ()方法,那么基類的 init ()就不會被自動呼叫了,
同 C++一樣,Python 支持多繼承,但要處理好兩個方面:
- 要找到合適的屬性
- 重寫方法時,如何呼叫對應父類以“發揮他們的作用”,同時,在子類中處理好自己的義務
vars()內建函式與 dir()相似,知識給定的物件都必須有一個 dict 屬性,vars()回傳一個字典,包含了物件存盤于其 dict 中的屬性(鍵)和值,
Python核心筆記一:歡迎來到Python世界【我從沒見過你 但我懂你】
Python核心筆記二:學習基礎、物件、字串、串列和元組【我從沒見過你 但我懂你】
新手入門Python核心筆記三:字典、回圈、輸入輸出、錯誤和例外、函式【我從沒見過你 但我懂你】
更多精彩內容可以關注公眾號

第十四章執行環境
Python 有三種不同型別的函式物件,分別是:
- 內建函式(BIF):C/C++寫的,編譯過后放到 Python 解釋器當中的,
- 用戶定義的函式(UDF)
- lambda 運算式
compile():
- 它允許程式員在運行時迅速生成代碼物件,然后就可以用 exec 陳述句或者內建函式
eval()來執行這些代碼或者對它們進行求值,
- compile(string, file, type) 這三個引數都是必須的,
- 第一個引數:string:要編譯的 Python 代碼
- 第二個引數:file:雖然是必須的,但通常被置為空串
- 第三個引數:type:字串,用來表明代碼的型別,有三個可能值: ‘eval’:可求值的運算式(和 eval()連用)
‘single’:單一可執行陳述句(和 exec 連用) ‘exec’:可執行陳述句組(和 exec 連用) Eg1:
>>>eval_code = compile(‘100+200’, ‘’, ‘eval’)
>>>eval(eval_code) 300
Eg2:
>>>single_code = compile(‘print “hello”’, ‘’, ‘single’)
>>>exec single_code Hello
用 compile()預編譯重復代碼有助于改善性能,因為在呼叫時不必經過位元組編譯處理,
exec obj :
接受物件(obj)可以是原始的字串,也可以是有效的Python 檔案,
一旦執行完畢,繼續對exec 的呼叫就會失敗,因為 obj 已經到了EOF 了,若想繼續呼叫 exec,則必須對 obj 呼叫 seek(0)到檔案開頭,
tell()方法:告知當前在檔案的何處os.path.getsize():告知物件檔案有多大
結束執行:
- sys.exit() and SystemExit
- sys.exitfunc()
- os._exit(status):跟以上兩種不同,它不執行任何清理就直接退出 Python 解釋器,且 status 引數是必須的,
第十五章正則運算式
Python 通過標準庫的 re 模塊來支持正則運算式(RE),
搜索 and 匹配:“模式匹配(patten-mactching)”
- 搜索(searching):在字串任意部分中搜索匹配的模式
- 匹配(matching):判斷一個字串能否從起始處全部或部分的匹配某個模式
正則運算式中常見的符號和字符
| 記號 | 說明 | 舉例 |
| re1|re2 | 匹配 re1 或者 re2 | foo|bar |
| . | 匹配任意字串(換行符除外) | b.b |
| ^ | 匹配字串的開始 | ^Dear |
| $ | 匹配字串的結尾 | /bin/*sh$ |
| * | 匹配前面出現的正則運算式零次或多次 | [A-Za-z0-9]* |
| + | 匹配前面出現的正則運算式一次或多次 | [a-z]+\.com |
| ? | 匹配前面出現的正則運算式零次或一次 | goo? |
| {N} | 匹配前面出現的正則運算式 N 次 | [0-9]{3} |
| {M,N} | 匹配重復出現 M 到 N 次的正則運算式 | [0-9]{5,9} |
| [?] | 匹配字符組中出現的任意字符 | [aeiou] |
| [x-y] | 匹配從字符 x 到y 的任意一個字符 | [0-9],[a-z] |
| [^?] | 不匹配此字符集中的任意字符 | [^aeiou] |
| \d | 匹配任何數字,和[0-9]一樣,\D 是\d 的反義 | data\d.txt |
| \w | 匹配任何數字字母字符,和[A-Za-z0-9]一樣 | [A-Za-z]\w+ |
| \s | 匹配任何空白字符,和[\n\t\r\v\f]一樣 | Of\sthe |
| \b | 匹配單詞邊界 | \bThe\b |
| \A(\Z) | 匹配字串的起始(結束) | \ADear |
反斜杠(\)表示對特殊字符進行轉譯
re 模塊:核心函式和方法
| 函式/方法 | 描述 |
| 模塊的函式 | |
| compile(pattern) | 對正則運算式模式 pattern 進行編譯 |
| re 模塊的函式和 regex 物件的方法 | |
| match(pattern,string) | 用 pattern 去匹配 string ,成功回傳物件,否則回傳 None |
| search(pattern,string) | 在 string 中去搜索 pattern 第一次出現,結果同上 |
| findall(pattern,string) | 在 string 中搜素 pattern 非重復出現,回傳串列 |
| finditer(pattern,string) | 功能同 findall,但回傳的是一個迭代器 |
| split(pattern,string) | 用 pattern 中的分隔符把 string 割成一個串列 |
| sub(pattern,repl,string) | 把 string 中所有 pattern 的地方替換為 repl |
| 匹配物件的方法 | |
| group(num=0) | 回傳全部匹配物件(或指定編號是 num 的子組) |
| groups() | 回傳一個包含全部匹配的子組的元組 |
r’sring’:用于忽略 string 中的所有特殊字符
正則運算式本身默認是貪心的,解決辦法就是用“非貪婪”運算子“?”,這個運算子可以用在“*”、“+”或者“?”的后面,它的作用是要求正則運算式引擎匹配的字符越少越好,
第十六章網路編程
客戶端/服務器架構
客戶端/服務器網路編程:
在完成服務之前,服務器必需要先完成一些設定,先要創建一個通訊端點,讓服務器能夠“監聽”請求,當服務器準備好之后,要通知客戶端,否則客戶端不會提出請求,客戶端比較簡單,只要創建一個通信端點,建立到服務器的連接,然后提出請求,一旦請求處理完成,客戶端收到了結果,通信就完成了,
套接字:通信端點
- 套接字是一種具有“通信端點”概念的計算機網路資料結構,
- 網路化的應用程式在開始任何通訊前都必需創建套接字,沒有它將沒辦法通信,
- 套接字有兩種,分別是基于檔案型的和基于網路型的,
- AF_UNIX:“地址家族:UNIX”,基于檔案
- AF_INET:“地址家族:Internet”,基于網路
- Python 只支持 AF_UNIX,AF_INET 和 AF_NETLINK 家族
面向連接/面向無連接:
- 面向連接:“虛電路”或者“流套接字”,TCP,套接字型別為 SOCK_STREAM
- 面向無連接:UDP,套接字型別為 SOCK_DGRAM (datagram 資料報)
創建套接字語法:
from socket import *
TCP 套接字:tcpSock = socket(AF_INET, SOCK_STREAM)
UDP 套接字:udpSock = socket(AF_INET, SOCK_DGRAM)
套接字物件的常用函式
| 函式 | 描述 |
| 服務器端套接字函式 | |
| s.bind(addr) | 系結地址 addr(主機號,埠號)到套接字 |
| s.listen(num) | 開始 TCP 監聽,最多允許 num 個連接進來 |
| s.accept() | 被動接受 TCP 客戶端連接,(阻塞式)等待連接的到來 |
|
| |
| 客戶端套接字函式 | |
| s.connect() | 主動初始化 TCP 服務器連接 |
| s.connect_ex() | Connect()函式的擴展版本,出錯時回傳出錯代碼,而不是例外 |
| 公共用途的套接字函式 | |
| s.recv() | 接收 TCP 資料 |
| s.send() | 發送 TCP 資料 |
| s.sendall() | 完整發送 TCP 資料 |
| s.recvfrom() | 接收 UDP 資料 |
| s.sendto() | 發送 UDP 資料 |
| s.close() | 關閉套接字 |
第十七章網路客戶端編程
把因特網比作是一個資料交換中心,資料交換的參與者是一個服務提供者和一個服務的使用者,有人把它比作“生產者– 消費者”,一般是一個生產者對多個消費者,
檔案傳輸網際協議:
- FTP:檔案傳輸協議(File Transfer Protocol)
- UUCP:Unix-to-Unix 復制協議(Unix-to-Unix Copy Protocol)
- HTTP:超文本傳輸協議(Hypertext Transfer Protocol)
- rcp/scp/rsync:Unix 下的遠程檔案復制指令
一般編程步驟:
- 連接到服務器
- 登陸(如果需要的話)
- 發出服務請求(有可能有回傳資訊)
- 退出
Python 和 FTP:from ftplib import FTP Python 和 NNTP:from nntplib import NNTP Python 和 SMTP:from smtplib import SMTP
對于 Python 中的 FTP、NNTP、SMTP 客戶端編程的“API”,此核心筆記不予累贅,請請閱相關檔案,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281641.html
標籤:python
