一。創建兩個類:
1. Person類:處理人員信息的類
2.Manager類:一個定制的Person類
二。實例及實例屬性:
1. 創建實例
模塊名次小寫,類名次第一個字母大寫
2.編寫構造函數:
2.1 統計人員的基本信息,作為實例屬性,以狀態信息保存到各個實例的命名空間里,供后續的調用。
2.2 以__init__構造函數來實現:在創建實例的同時創建這些實例的屬性
基本信息無默認值的方式:
傳入參數name,job,pay均為類的本地變量,self.name/job/pay為實例變量
基本信息有默認值的方式:
函數的參數采用了關鍵字參數
3.進行中測試:
3.1增量原型:寫一部分代碼,測試,再寫一部分代碼,再測試
3.2 if __name__==__main__:
模塊是對象,並且所有的模塊都有一個內置屬性 __name__。一個模塊的 __name__ 的值取決於您如何應用模塊。如果 import
一個模塊,那么模塊__name__ 的值通常為模塊文件名,不帶路徑或者文件擴展名。但是您也可以像一個標准的程序樣直接
運行模塊,在這 種情況下,__name__ 的值將是一個特別缺省"__main__"
在cmd 中直接運行.py文件,則__name__的值是'__main__';
而在import 一個.py文件后,__name__的值就不是'__main__'了;
從而用if __name__ == '__main__'來判斷是否是在直接運行該.py文件
因此,此語句用於本模塊里運行並顯示調試/測試代碼的結果,但是本模塊導入到其他模塊的時候,由於此if條件為False,if下的
測試代碼就不會運行之所以用這個if語句的具體原因如下:
三。添加方法:
1. 類之外的硬編碼:
這種方式,每個實例都需要寫一次代碼,導致代碼的冗余,同時,后期維護時,變更邏輯,需要每個實例都去
做一一的修改,弊端很明顯。
2. 編寫類方法:
封裝:把操作邏輯包裝到界面之后
四。運算符重載:
運行結果:
五。通過子類定制(擴展)方法/實例屬性:
1. 編寫一個子類:Manager:
2. 擴展:不好的方式
3. 擴展:好的方式
4. 擴展實例屬性:
由於調用manager類產生的實例,他們job統一都是“mgr”,沒有必要傳參數,通過__init__的定制,
在Manager子類直接寫死。
六。多態:
下面的例子里由於Bob,Sue,Tom由不同的類產生的,在for循環里,調用的giveRaise方法是不同的,即所謂的“多態”。
七。使用內省工具了解類的內容及結構
(一)概念:
了解python對象內部運行,和處理機制的一些命令或工具
1.類的字典屬性:__dict__及__dict__keys:
由於類及實例的命名空間均是采用字典的模式,因此可以用上面的命令獲取類及實例的所有鍵及其值
1.1 __dict__只顯示self的屬性,不顯示繼承類的屬性,因為類屬性還是在類里面,沒有復制到實例的命名空間
1.2如果要顯示繼承的類屬性可以用dir()命令
1.3 python2的版本和python3的版本顯示上會有差別,python3上顯示的更多些
2.dir()函數:顯示類的所有屬性及實例,但不顯示屬性對應的值,即只顯示“鍵”,不顯示”值“
3.用於實例的__class__,__class__.__name__:查找繼承類
4.用於類的__bases__,__name__:查找超類
(二)樣例:
樣例一:里面的一些調用方法可以直接拿來用在測試里
樣例二:
(三)一種通用的類及實例顯示模式:
(四)完整的Person,Manager類代碼:
運行結果:和調用運算符重載__str__對比差異:
(五)這些內省工具命名的規則:
原則:避免和應用的類命名沖突,導致在類繼承中被覆蓋
八。使用文件或數據庫,使類的數據持久化