1. 程式人生 > >Python Day7(相關補充)

Python Day7(相關補充)

decode 設置 lib str 信息 rec message 種類 代碼塊

一、其他相關

1.isinstance(obj, cls)
檢查是否obj是否是類 cls 的對象
1 class Foo(object):
2     pass
3 
4 obj = Foo()
5 
6 print(isinstance(obj, Foo))
7 # True
2.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     except
ValueError 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 ZeroDivisionError
View 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(相關補充)