Python Day7(相關補充)
阿新 • • 發佈:2017-05-28
decode 設置 lib str 信息 rec message 種類 代碼塊
檢查是否obj是否是類 cls 的對象二、異常處理
1.異常基礎
在程序運行過程中,如果不想因為某個異常造成程序退出,則可以使用異常處理來抓取某類異常,從而讓程序不會中斷。
一、其他相關
1.isinstance(obj, cls)檢查是否obj是否是類 cls 的對象
1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 print(isinstance(obj, Foo)) 7 # True2.issubclass(sub, super) 檢查sub類是否是super類的子類
1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass 6 7 print(issubclass(Bar, Foo)) 8 # True
二、異常處理
1.異常基礎
在程序運行過程中,如果不想因為某個異常造成程序退出,則可以使用異常處理來抓取某類異常,從而讓程序不會中斷。
1 while True: 2 num1 = input(‘num1:‘) 3 num2 = input(‘num2:‘) 4 try: 5 num1 = int(num1) 6 num2 = int(num2) 7 result = num1 + num2 8 except ValueError as e: 9 print(‘出現異常,信息如下:‘)10 print(e)
上述代碼即抓住了一個ValueError的異常。
2.抓取多個異常 怎麽抓取多個異常呢?如果一個代碼塊可能會有多種異常情況出現,則可以這樣寫:1 l = [] 2 while True: 3 num1 = input(‘num1:‘) 4 num2 = input(‘num2:‘) 5 print(l[2]) 6 try: 7 num1 = int(num1) 8 num2 = int(num2) 9 result = num1 + num2 10 exceptValueError as e: 11 print(e) 12 except IndexError as e: 13 print(e)
還可以這樣寫:
1 l = [] 2 while True: 3 num1 = input(‘num1:‘) 4 num2 = input(‘num2:‘) 5 print(l[2]) 6 try: 7 num1 = int(num1) 8 num2 = int(num2) 9 result = num1 + num2 10 except (ValueError, IndexError) as e: 11 print(e)註:這樣寫的問題是,不知道哪句代碼出錯,它的用處是當這兩種錯誤都出現時,統一采用一種處理辦法時使用 3.萬能異常 在python的異常中,有一個萬能異常:Exception,他可以捕獲任意異常,即:
1 l = [] 2 while True: 3 try: 4 l[2] 5 except Exception as e: 6 print(e)
註:抓住所有的錯誤,一般不建議在開頭就使用,因為不好調試
1 l = [] 2 while True: 3 try: 4 l[2] 5 except ValueError as e: 6 print(e) 7 except IndexError as e: 8 print(e) 9 except Exception as e: 10 print(e)註:一般萬能異常放在最後抓取未知錯誤 TIP:萬能異常並不是一定萬能的,比如縮進錯誤及一些語法異常或者其他某些異常是抓取不到的 4.異常結構 如下所示:
1 l = [] 2 try: 3 l[2] 4 except ValueError as e: 5 print(e) 6 except IndexError as e: 7 print(e) 8 except Exception as e: 9 print(e) 10 else: 11 print("balalala") # 程序一切正常,才會執行此段代碼 12 finally: 13 print("balalalallala") # 不管程序有沒有出錯,此段代碼總會執行5.自定義異常&主動觸發異常 如下所示:
1 class MyException(Exception): # 自定義異常,繼承異常類Exception 2 def __init__(self, msg): 3 self.message = msg 4 5 def __str__(self): 6 return self.message 7 8 try: 9 raise MyException(‘我的異常‘) # 主動觸發異常,關鍵字raise 10 except MyException as e: 11 print(e)6.異常種類 python中的異常種類非常多,每個異常專門用於處理某一項異常!!! 常用異常:
1 AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x 2 IOError 輸入/輸出異常;基本上是無法打開文件 3 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 4 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 5 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] 6 KeyError 試圖訪問字典裏不存在的鍵 7 KeyboardInterrupt Ctrl+C被按下 8 NameError 使用一個還未被賦予對象的變量 9 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) 10 TypeError 傳入對象類型與要求的不符合 11 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由於另有一個同名的全局變量, 12 導致你以為正在訪問它 13 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的View Code
更多異常:
1 ArithmeticError 2 AssertionError 3 AttributeError 4 BaseException 5 BufferError 6 BytesWarning 7 DeprecationWarning 8 EnvironmentError 9 EOFError 10 Exception 11 FloatingPointError 12 FutureWarning 13 GeneratorExit 14 ImportError 15 ImportWarning 16 IndentationError 17 IndexError 18 IOError 19 KeyboardInterrupt 20 KeyError 21 LookupError 22 MemoryError 23 NameError 24 NotImplementedError 25 OSError 26 OverflowError 27 PendingDeprecationWarning 28 ReferenceError 29 RuntimeError 30 RuntimeWarning 31 StandardError 32 StopIteration 33 SyntaxError 34 SyntaxWarning 35 SystemError 36 SystemExit 37 TabError 38 TypeError 39 UnboundLocalError 40 UnicodeDecodeError 41 UnicodeEncodeError 42 UnicodeError 43 UnicodeTranslateError 44 UnicodeWarning 45 UserWarning 46 ValueError 47 Warning 48 ZeroDivisionErrorView Code
7.斷言
1 class A(object): 2 3 def __init__(self): 4 self.name = "Breakering" 5 6 obj = A() 7 8 assert type(obj.name) is str # 斷言,只有滿足條件程序才會繼續往下走 9 10 print("pass")
用處:如果後面的代碼比較重要,且依賴一些條件,斷言此時就可以去篩選這些條件看看滿不滿足,如果滿足條件,後面的代碼才可繼續執行,相當於過安檢
三、反射
python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
1 hasattr(obj, name_str) 判斷一個對象obj裏是否有對應字符串name_str 的方法 2 getattr(obj, name_str ) 根據字符串name_str去獲取obj對象裏的對應的方法的內存地址 3 setattr(x, y, z) is equivalent to "x.y = z" 4 delattr(obj, name_str) 根據字符串name_str去刪除obj對象裏對應的方法
結論:反射是通過字符串的形式操作對象相關的成員。一切事物都是對象!!!
四、動態導入模塊
模塊結構:
動態導入模塊如下所示:
1 # python解釋器自用 2 lib = __import__("lib.aa") 3 4 print(lib.aa) 5 # <module ‘lib.aa‘ from ‘D:\\PythonStudy\\day07\\lib\\aa.py‘> 6 7 obj = lib.aa.C() 8 print(obj.name) 9 # Breakering 10 11 # 官方建議 12 import importlib 13 14 aa = importlib.import_module("lib.aa") 15 16 print(aa.C().name) 17 # Breakering
Python Day7(相關補充)