在以前咱們已經說過了 Python 中內置的主要的幾種對象類型,(數,字符串,列表,元組和字典)。而面向對象的核心人物還沒出場呢 。那麼咱們常說的對象是什麼類型的呢,其實他的類型就是「類」。繼承封裝和多態,這是通用的面向對象編程的思想 。編程
繼承是爲了提升代碼的複用性,子類能夠經過繼承父類來實現父類中的方法,這就是光明正大的偷懶 。舉例:dom
class Person(): def eat(self): print("person can eat ...") def slepp(self): print("person can slepp ...") calss Man(Person): def hardWork(self): print("man should be work hard ...") # 測試 m = Man() m.eat() # person can eat ...
以上一個例子,說明了不少問題,首先,定義類是使用class
關鍵字,定義方法使用def
,默認傳入一個參數,其實這個參數不必定非要叫self
可是爲了辨識性,咱們這樣定義,由於它表明的就是當前對象,相似 Java 中的 this 。固然還有咱們的繼承是經過一個括號+父類來定義的,那爲何Person沒有寫呢,其實這裏省略了一個object
不寫就表示默認繼承 object
超類 。另外,Python 支持多繼承,像這樣便可,calss Man(Animal,Person)
一個問題須要注意,當多個父類中含有同一個方法時,之後面的爲準 。可是,強烈不推薦你們使用多繼承 。函數
封裝,理解起來很簡單,就是將類中的屬性信息隱藏起來,提供公共的方法以備調用,咱們將屬性進行 」 私有化 「,在屬性的前面加上兩個下劃線 __name
定義一個假的私有的屬性 。看例子:測試
class Man(): def __init(self): # 這是對象的初始化方法,建立對象是默認執行 self.__name = '' def set_name(self,name): self.__name = name def get_name(self): return self.__name m = Man() # 建立對象 m.set_name('YJK923') # 設置 name 值 ( 實際上是 _Man__name ) m.get_name() # 獲取 name 值 ( 實際上是 _Man__name ) 'YJK923' m.name = 'YJK' #注意這裏是另外添加了一個屬性 name m.get_name() # 獲取 name 值 ( 實際上是 _Man__name ) 'YJK923' m.name # 獲取的是剛剛爲 m 建立的 name 的值 'YJK' m._Man__name # 獲取屬性 _Man__name ,這就是 Python 貓膩的地方,其實並無私有化,只是轉化格式了 。 'YJK923'
還有就是多態了,簡單理解,就是有多種狀態,常見的就是同一個方法可是執行的效果卻不同,就像是同一個名字人有太多了,而每一個人卻又不同,看吧,編程思想也都是來自於平常的生活 。舉例吧 ,都是睡覺 ,可是有的人喜歡躺在牀上,有的人喜歡睡在椅子上 。用代碼怎麼實現呢 ?看下面this
class People(): def sleep(self): print("人睡覺 。。。") class Roommate(People): def sleep(self): print('睡在椅子上 。。。')
看吧,一樣是睡覺,Roommate 倒是睡在椅子上,經過繼承的方式實現多態只是實現多態的一種方式而已 。還能夠經過其它的方式,比方說這樣,方法的參數是超類。spa
# 不一樣的對象調用一樣的方法,結果卻同樣 。 fun(obj): print( obj.__len__() )
附加說幾個比方經常使用的方法設計
# 標準模塊 random 中包含一個名爲 choice 的函數,用於從序列中水機選擇一個元素。 from random import choice x = choice(['Hello,world !',[1,2,'e','e',4]]) x.count('e') 2 # 隨機生成的,也可能不是 2 # 判斷類 A 是否是 B 的子類 issubclass(A,B) # 兒子在前,老子在後 # 查找類 A 的全部父類 A.__bases__ # 查找一個對象 A 中的全部屬性 A.__dict__ # 查找對象 A 屬於哪個類 A.__class__ # 檢查方法或屬性是否存在與對象中 hasattr(instance,'methedName | attrName') # 設置對象的屬性 setattr(instance,'attrName',value')
關於抽象類:定義了一種規則(抽象方法),繼承這個類的子類必須實現抽象類中的抽象方法 。並且,抽象類是不能被實例化的 。
Python 中引入了 abc
模塊來實現抽象類的定義,示例:code
# 下面表示定義了一個 抽象類 Talker , 包含一個抽象方法 talk . from abc import ABC,abstractmethod class Talker(ABC): @abstractmethod def talk(self): pass
插播一曲關於面向對象設計的一些思考 。對象
如何將需求轉化爲具體的實體類呢 ? 咱們能夠嘗試這樣作 。 將需求描述出來記錄其中的名詞,動詞和形容詞。 在名詞中找出可能的類, 在動詞中找出可能的方法, 在形容詞中找出可能的屬性, 最後將找出的方法和屬性分配給各個類。 這樣類的模型就出來了,而後咱們能夠思考對象之間的關係,繼承或是組合。 後面再思考一下對應業務有哪些可使用的模式,待各個業務模塊都思考清楚後就能夠着手編程了 。
下面簡單的說一下 Python 中的異常處理機制 。blog
拋出異常使用關鍵字 raise
例如,raise Exception('exception msg !')
可是須要注意的是異常的拋出只能是 Exception 或 Exception 的子類 。
捕獲異常:咱們可使用try ... except : ... finally: ...
語句塊來處理可能出現異常的代碼 。
try 1 / 0 except ZeroDivisionError as e: print(e) else : print('No exception will run ...') finally : print('must be run ... ')
自定義異常類,定義一個類繼承 Exception 類便可 。
class MyException(Exception): pass