Python 中的面向對象和異常處理

在以前咱們已經說過了 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

 

插播一曲關於面向對象設計的一些思考 。對象

  1. 將相關的東西放在一塊兒,若是一個方法要使用全局變量,那就將他做爲類的屬性和方法
  2. 不要讓對象之間過於親密 。這就是所謂的解耦和吧 。
  3. 慎用繼承,尤爲是多重繼承 。
  4. 保持簡單,讓方法儘量的短小精悍 。
如何將需求轉化爲具體的實體類呢 ? 咱們能夠嘗試這樣作 。
將需求描述出來記錄其中的名詞,動詞和形容詞。
在名詞中找出可能的類,
在動詞中找出可能的方法,
在形容詞中找出可能的屬性,
最後將找出的方法和屬性分配給各個類。
這樣類的模型就出來了,而後咱們能夠思考對象之間的關係,繼承或是組合。
後面再思考一下對應業務有哪些可使用的模式,待各個業務模塊都思考清楚後就能夠着手編程了 。

下面簡單的說一下 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
相關文章
相關標籤/搜索