Python學習手冊-24~27章
第24章 高階模組話題
在模組中隱藏資料
最小化from * 的破壞:_X和__all__
from *語句只會把列在__all__列表中的這些變數名複製出來。如果沒有定義__all__,from *就會複製出開頭沒有下劃線的所有變數名。
_X __all__列表只對from *語句這種形式有效。
混和用法模式:__name__ 和 __main__
如果檔案以頂層程式檔案執行,在啟動時,__name__就會設定成字串”__main__”。
如果檔案被匯入,__name__就會改設成客戶端了解的模組名。
__name__充當一個使用模式標誌,允許它編寫成一個可匯入的庫和一個頂層指令碼。
以__name__進行單元測試
在__name__檢查區塊內封裝了自我測試的呼叫,使其在檔案作為頂層指令碼執行時才會啟動,而匯入則不會。
使用帶有__name__的命令列引數
import sys
sys.argv 字串列表包含了命令列引數,第一項總是將要執行的指令碼的名稱。
修改模組的搜尋路徑
import sys
sys.path 在程式啟動時就會初始化,如果修改,只在修改的python會話或程式中才會存續,在Python結束後,不會保留下來。PYTHONPATH和.pth檔案路徑配置是儲存在作業系統中,而不是執行中的python程式。
Import語句和from語句的as擴充套件
import nodulemane as name
相當於:
import modulename
name = modulename
del modulename
from modulename import attrname as name
用名稱字串匯入模組
modname = “string”
import modname #err
string = __import__(modname)
模組設計理念
需要思考哪些函式要放進模組、模組通訊機制等。當開始編寫較大的
模組陷阱
頂層程式碼的語句次序的重要性
在匯入時,模組檔案頂層的程式程式碼一旦python執行到時,就會立刻執行。因此,該語句不能引用檔案後面的變數名。
位於函式主體內的程式碼直到函式被呼叫到後才會執行。因為函式內的變數名在函式實際執行前都不會解析,通常可以引用檔案內任意地方的變數。
from複製變數名,而不是連線
from *會讓變數語義模糊
在from 語句中明確列出想要的屬性,如果使用import而不是from,也可以避開這個問題。
reload不會影響from匯入,且最佳原則就是不要將它們結合起來使用。使用reload和import
第25章 OOP:巨集偉藍圖
在Python中,OOP完全是可選的,在初級階段不需要使用類。簡單的指令碼程式碼,可以做很多事。^_^
做長期python產品開發的人對類更感興趣一些。
為何使用類
大的用處:
繼承、組合
用類建立新物件:
多重例項、通過繼承進行定製、運算子過載
概覽OOP
屬性的繼承搜尋
python中大多OOP的用法,都可以簡化成object.attribute。用類物件呼叫這個表示式讀取屬性或呼叫物件的方法時,python啟動搜尋。搜尋物件連線的樹,來尋找attribute首次出現的物件。由下向上,由左到右。
類:類是例項工廠,類的屬性提供了行為,所有從類產生的例項都繼承該類的屬性。
例項:代表程式領域中具體的元素。例項屬性記錄資料,而每個特定物件的資料都不同。
類方法呼叫
I2.w() 呼叫對映為C3.w(I2), Python把隱含的例項傳進方法中的第一個特殊的引數,習慣上將其稱為self.
編寫類樹
每個class語句會生成一個新的類物件。
每次類呼叫,就會生成一個新的例項物件。
例項自動連線到建立了這些例項的類。
類連線至其超類的方式是,將超類列在類頭部的括號內從左到右的順序會決定樹中的次序。
__init__建構函式
OOP是為了程式碼重用
大體而言,OOP就是在樹中搜索屬性。
事實上,應用領域中所謂的軟體框架,就是把常見程式設計任務實現成類,可以讓你在應用程式中混合。利用軟體框架,只需編寫子類,填入所需的一兩個方法。
第26章 類程式碼編寫基礎
類物件提供預設行為
class語句建立類物件並將其賦值給變數名,就像def應用,class語句一般是在其所在檔案匯入時執行的。
class語句內的賦值語句會建立類的屬性。
類屬性提供物件的狀態和行為。類物件的屬性可由類所建立的所有例項共享。
例項物件是具體的元素
像函式那樣呼叫類物件會建立新的例項物件。
每個例項物件繼承類的屬性並獲得了自己的名稱空間。
在類方法內對self屬性做賦值運算會產生每個例項自己的屬性。
類通過繼承經行定製
超類列在了類開頭的括號中。
類從其超類中繼承了屬性。
例項會繼承所有可以讀取的類的屬性。
每個object.attribute都會開啟新的獨立搜尋。
邏輯的修改是通過建立子類,而不是修改超類。
樹中較低發生的重新定義的,取代屬性的動作稱為覆蓋。
類是模組內的屬性
類可以獲取python運算子
運算子可以讓類與Python的物件模型相整合。過載型別運算時,以類實現的使用者定義物件的行為就會像內建物件一樣。因此,提供了一致性,以及與預期介面的相容性。
第27章 更多例項
步驟1:建立例項
在Python中,模組使用小寫字母開頭,類名使用一個大寫字母開頭。
編寫建構函式
例項物件的屬性,它們通過給類方法函式中的self屬性賦值來創造。在__init__建構函式方法中將它們賦值給self,在每次建立一個例項時,Python會自動執行__init__程式碼。
在進行中測試
在進行中測試比編寫大量程式碼後再一次性測試要更自然。類似UT。
以兩種方式使用程式碼,以免import時執行不必要的測試程式碼
class Person: def __init__(self,name,job=None,pay=0): self.name = name self.job = job self.pay = pay
if __name__ == ‘__main__’: #self-test code |
步驟2:新增行為方法
編寫方法
步驟3:運算子過載
例子,提供列印顯示
步驟4:通過子類定製行為
編寫子類
擴充套件方法
繼續、定製和擴充套件
步驟5:定製建構函式
person.py
from classtools import AttrDisplay
class Person(AttrDisplay): “”” Create and process person record “”” def __init__(self,name,job=None,pay=0): self.name = name self.job = job self.pay = pay def lastName(self): return self.name.split()[-1] def giveRaise(self,percent): self.pay = int(self.pay * (1+percent))
class Manager(Person): “”” A customized Person with special requirements “”” def __init__(self, name, pay): Person.__init__(self, name, ‘mgr’, pay) def giveRaise(self, percent, bonus = 0.1) Person.giveRaise(self, percent + bonus)
if __name__ == ‘__main__’: #test-code bob = Person(‘Bob Smith’) print(bob) |