1. 程式人生 > >Python學習手冊-24~27章

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系統時,就會變得明朗起來。

模組陷阱

頂層程式碼的語句次序的重要性

在匯入時,模組檔案頂層的程式程式碼一旦python執行到時,就會立刻執行。因此,該語句不能引用檔案後面的變數名。

位於函式主體內的程式碼直到函式被呼叫到後才會執行。因為函式內的變數名在函式實際執行前都不會解析,通常可以引用檔案內任意地方的變數。

from複製變數名,而不是連線

from *會讓變數語義模糊

from 語句中明確列出想要的屬性,如果使用import而不是from,也可以避開這個問題。

reload不會影響from匯入,且最佳原則就是不要將它們結合起來使用。使用reloadimport

 

第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)