目錄python
檢查是否obj是不是類 cls 的對象編程
class Foo(object): pass obj = Foo() isinstance(obj, Foo)
檢查sub類是不是 super 類的派生類設計模式
class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo)
在編程過程當中爲了增長友好性,在程序出現bug時通常不會將錯誤信息顯示給用戶,而是現實一個提示的頁面,通俗來講就是不讓用戶看見大黃頁!!!併發
try: pass except Exception,ex: pass
需求:將用戶輸入的兩個數字相加函數
while True: num1 = raw_input('num1:') num2 = raw_input('num2:') try: num1 = int(num1) num2 = int(num2) result = num1 + num2 except Exception, e: print '出現異常,信息以下:' print e
python中的異常種類很是多,每一個異常專門用於處理某一項異常!!!設計
經常使用的異常 AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x IOError 輸入/輸出異常;基本上是沒法打開文件 ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典裏不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量, 致使你覺得正在訪問它 ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
實例code
dic = ["wupeiqi", 'alex'] try: dic[10] except IndexError, e: print e dic = {'k1':'v1'} try: dic['k20'] except KeyError, e: print e s1 = 'hello' try: int(s1) except ValueError, e: print e
對於上述實例,異常類只能用來處理指定的異常狀況,若是非指定異常則沒法處理。對象
未捕獲到異常,程序直接報錯 s1 = 'hello' try: int(s1) except IndexError,e: print e
因此,寫程序時須要考慮到try代碼塊中可能出現的任意異常,能夠這樣寫:索引
s1 = 'hello' try: int(s1) except IndexError,e: print e except KeyError,e: print e except ValueError,e: print e
萬能異常 在python的異常中,有一個萬能異常:Exception,他能夠捕獲任意異常,即:內存
s1 = 'hello' try: int(s1) except Exception,e: print e
接下來你可能要問了,既然有這個萬能異常,其餘異常是否是就能夠忽略了!
答:固然不是,對於特殊處理或提醒的異常須要先定義,最後定義Exception來確保程序正常運行。
s1 = 'hello' try: int(s1) except KeyError,e: print '鍵錯誤' except IndexError,e: print '索引錯誤' except Exception, e: print '錯誤'
try: # 主代碼塊 pass except KeyError,e: # 異常時,執行該塊 pass else: # 主代碼塊執行完,執行該塊 pass finally: # 不管異常與否,最終執行該塊 pass
try: raise Exception('錯誤了。。。') except Exception,e: print e
class WupeiqiException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise WupeiqiException('個人異常') except WupeiqiException,e: print e
# assert 條件 assert 1 == 1 assert 1 == 2
python中的反射功能是由如下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
class Foo(object): def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' obj = Foo() # #### 檢查是否含有成員 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 獲取成員 #### getattr(obj, 'name') getattr(obj, 'func') # #### 設置成員 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 刪除成員 #### delattr(obj, 'name') delattr(obj, 'func')
類是對象
class Foo(object): staticField = "old boy" def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' @staticmethod def bar(): return 'bar' print getattr(Foo, 'staticField') print getattr(Foo, 'func') print getattr(Foo, 'bar')
反射也是對象
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 程序目錄: home.py index.py 當前文件: index.py """ import home as obj #obj.dev() func = getattr(obj, 'dev') func()
設計模式之單例模式
單例設計模式是怎麼來的?
在面向對象的程序設計中,當業務併發量很是大時,那麼就會出現重複建立相同的對象,每建立一個對象就會開闢一塊內存空間,而這些對象實際上是如出一轍的,那麼有沒有辦法使用得內存對象只建立一次,而後再隨處使用呢?單例模式就是爲了解決這個問題而產生的。
實現方式:
1、建立一個類靜態字段(類變量)__instance
2、建立一個靜態函數,經過函數的邏輯判斷 __instance 是否已存在,如不存在就將對象值賦於__instance,即__instance = 類(),不然直接返回__instance,也即建立的對象都是同樣的
3、使用單例模式建立對象時直接經過類調用靜態函數建立便可
#普通模式 class A(object): def __init__(self,name,male): self.name = name self.name = male #實例化多個對象 obj1 = A('ben','boy') obj2 = A('min','girl') obj3 = A('miao','boy') ##打印內存地址,能夠看到內存地址都是不同的 print id(obj1),id(obj2),id(obj3) #單例模式 class A(object): __instance = None def __init__(self,name,male): self.name = name self.name = male @staticmethod def create_obj(): if not A.__instance: A.__instance = A('ben','boy') return A.__instance else: return A.__instance #單例模式實例化多個對象 obj1 = A.create_obj() obj2 = A.create_obj() obj3 = A.create_obj() ##打印內存地址,能夠看到內存地址都是同樣的 print id(obj1),id(obj2),id(obj3)
result :
1 >>> #普通模式 2 ... class A(object): 3 ... def __init__(self,name,male): 4 ... self.name = name 5 ... self.name = male 6 ... 7 >>> #實例化多個對象 8 ... obj1 = A('ben','boy') 9 >>> obj2 = A('min','girl') 10 >>> obj3 = A('miao','boy') 11 >>> ##打印內存地址,能夠看到內存地址都是不同的 12 ... print id(obj1),id(obj2),id(obj3) 13 140230687882448 140230687882512 140230687882576 14 >>> 15 >>> #單例模式 16 ... class A(object): 17 ... __instance = None 18 ... def __init__(self,name,male): 19 ... self.name = name 20 ... self.name = male 21 ... @staticmethod 22 ... def create_obj(): 23 ... if not A.__instance: 24 ... A.__instance = A('ben','boy') 25 ... return A.__instance 26 ... else: 27 ... return A.__instance 28 ... 29 >>> #單例模式實例化多個對象 30 ... obj1 = A.create_obj() 31 >>> obj2 = A.create_obj() 32 >>> obj3 = A.create_obj() 33 >>> ##打印內存地址,能夠看到內存地址都是同樣的 34 ... print id(obj1),id(obj2),id(obj3) 35 140230687882832 140230687882832 140230687882832 36 >>>