pyrhon類約束及異常處理和日誌模塊

類的約束程序員

 class Base:     #對子類進行了約束,必須重寫該方法
     def login(self):
         print('方法錯誤,必須用定義login方法')
         # 發現了notImplementedError繼承他,直接重寫他
         # raise NotImplementedError("你要重寫一下login這個方法,不然報錯!")    # 拋異常
 
 class Member(Base):
     def login(self):
         print('個人功能是普通用戶登陸')
 class Admin(Base):
     def login(self):
         print('個人功能是版主登陸')
 class Houtai(Base):
     # def denglu(self):     #報錯,上層程序員寫代碼沒有按照規範來
     #     print('個人功能是管理員登陸')
 
     def login(self):
         print('個人功能是管理員登陸')
 
 def Deng(obj):      # 整合這些個功能
     obj.login()
 m = Member()
 admin = Admin()
 ht = Houtai()
 Deng(m)
 Deng(admin)
 Deng(ht)
 結果
 個人功能是普通用戶登陸
 個人功能是版主登陸
 個人功能是管理員登陸

抽象類和抽象方法
抽象方法不須要給出具體的方法體,抽象方法內只寫一個pass就能夠了
在一個類中若是有一個方法是抽象方法,那麼這個類必定是一個抽象類
抽象類中,若是有抽象方法,此時這個類不能建立對象
若是一個類中全部的方法都是抽象方法,這個類能夠被稱爲接口類
寫一個抽象方法:
導入一個模塊函數

 1 from abc import ABCMeta,abstractmethod
 2 class Animal(metaclass=ABCMeta):    #就是個抽象類
 3     @abstractmethod
 4     def chi(self):  # 吃只是一個抽象概念,沒辦法完美的描述出來吃什麼東西
 5         pass
 6 
 7     def he(self):   # 抽象類中能夠有正常的方法
 8         print('喝水')
 9 
10 class Cat(Animal):  # 此時Cat裏面也有一個抽象方法,此時的Cat是建立不了對象的
11     pass
12 
13 class Dog(Animal):
14     def chi(self):  # 重寫父類中的抽象方法
15         print('狗吃肉')
16 # c = Cat()
17 # c.chi()   #TypeError: Can't instantiate abstract class Cat with abstract methods chi
18 d = Dog()
19 d.chi()
20 結果
21 狗吃肉
複製代碼

MD5加密測試

複製代碼
 1 import hashlib
 2 obj = hashlib.md5(b'鹽') #鹽又稱雜質,一般密碼中添加,雖然MD5不可逆推,可是不加鹽能夠撞庫算出密碼
 3 obj.update('密碼'.encode('utf-8'))
 4 print(obj.hexdigest())
 5 結果
 6 一串MD5數字
 7 
 8 
 9 案例
10 import hashlib
11 #定義本身的MD5功能
12 def my_md5(s):
13     obj = hashlib.md5(b'zazhi')      # 加鹽
14     obj.update(s.encode('utf-8'))    #把要加密的內容給md5
15     return obj.hexdigest()
16 print(my_md5('123456'))
17 
18 user = 'bob'
19 pwd = 'abf6a5b33687f111e79f615a6d1fb76a'
20 
21 #登陸
22 uname = input('用戶名:')
23 upwd = input('密碼:')
24 if uname == user and my_md5(upwd) == pwd:
25     print('登陸成功')
26 else:
27     print('登陸失敗')
複製代碼

異常處理加密

複製代碼
 1 print(1 / 0)
 2 print('哈哈哈哈哈')
 3 結果
 4 ZeroDivisionError: division by zero
 5 
 6 # 0不能作除數,在程序執行的時候產生了一個錯誤
 7 # 系統會拋出這個錯誤,若是沒有人處理,錯誤就會顯示給用戶
 8 
 9 單行異常處理
10 try:
11     print(1/0)
12 except ZeroDivisionError:
13     print('報錯ZeroDivisionError')
14 結果
15 報錯ZeroDivisionError
複製代碼

多行異常處理
若是在異常處理的時候,其中一個報錯類型觸發,其餘的報錯類型就不會觸發,處理完觸發的報錯後自動退出spa

複製代碼
 1 try:
 2     print(1/10)
 3     f =  open('','r')
 4     dic = {[]:123}
 5 except ZeroDivisionError:        #處理ZeroDivisionError類型錯誤
 6     print('報錯ZeroDivisionError')
 7 except FileNotFoundError:       #處理FileNotFoundError類型錯誤
 8     print('報錯FileNotFoundError')
 9 except Exception:               # 能夠處理全部錯誤
10     print('其餘全部類型錯誤')
11 else:                           # 當try中的代碼不產生任何錯誤的時候,會自動的執行else裏的代碼
12     print('沒有錯誤時候執行這句話')
13 finally:                        # 最終,無論出錯仍是不出錯,都要執行最後的finally,通常用來收尾
14     print('不管有沒有錯誤都執行')
15 結果
16 0.1
17 報錯FileNotFoundError
18 不管有沒有錯誤都執行
複製代碼

自定義異常
class 類(Exception):
    pass
隨便寫一個類,這個類只要繼承了Exception這個類就是一個異常類就能夠做爲raise對象
拋出異常
raise 異常類(錯誤信息)debug

複製代碼
 1 class TextException(Exception):     #自定義異常
 2     pass
 3 
 4 def Text(a,b):
 5     if (type(a) == int or type(a) == float ) and (type(b) == int or type(b) == float):
 6         return a + b
 7     else:
 8         raise TextException('Text函數錯誤')     #raise 拋出異常
 9 print(Text('哈哈',2))
10 結果
11 Traceback (most recent call last):
12   File "E:/Py3Practise/day01/test.py", line 11, in <module>
13     print(Text('哈哈',2))
14   File "E:/Py3Practise/day01/test.py", line 10, in Text
15     raise TextException('Text函數錯誤')
16 __main__.TextException: Text函數錯誤
複製代碼

堆棧
import traceback
traceback.format_exc()調試

複製代碼
 1 import traceback        # 用來查看堆棧信息(錯誤信息叫堆棧信息)
 2 class GenderException(Exception):
 3     pass
 4 class Person:
 5     def __init__(self,name,gender):
 6         self.name = name
 7         self.gender = gender
 8     def xz(self):
 9         print(f'{self.name}在洗澡')
10 def nan(ren):
11     if ren.gender == '男':
12         ren.xz()
13     else:
14         raise GenderException('男女有別')   # 拋異常是很重要的
15 try:
16     p1 = Person('bob','不詳')
17     p2 = Person('jack','男')
18     nan(p1)
19     nan(p2)
20 except GenderException:
21     ret = traceback.format_exc()    # 查看堆棧信息,看錯誤的
22     print(ret)
23     # print('報錯了')               #自定義堆棧信息
24 結果
25 Traceback (most recent call last):
26   File "E:/Py3Practise/day01/test.py", line 20, in <module>
27     nan(p1)
28   File "E:/Py3Practise/day01/test.py", line 16, in nan
29     raise GenderException('男女有別')
30 GenderException: 男女有別
複製代碼

日誌處理
import logging
日誌等級:
critical: 50
error: 40
warning: 30
info: 20
debug: 10日誌

複製代碼
 1 記錄日誌初級版本
 2 配置好日誌的處理,默認就是GBK
 3 logging.basicConfig(filename='x1.txt', # 把日誌信息寫入的文件名
 4                     format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
 5                     datefmt='%Y-%m-%d %H:%M:%S', # 時間的格式
 6                     level=30)   # 當前配置表示 30及以上的日誌信息會被寫入日誌文件,30如下的不記錄
 7 
 8 # 向日志文件寫入內容
 9 logging.critical("系統要爆炸")   # 50 幾乎是最高的
10 logging.error("服務程序宕機")    # 40 平時使用最多的就是他
11 logging.warn("服務發生了一個警告") # 30 警告
12 logging.warning("和warn同樣發生了一個警告")
13 logging.info("提示信息")        # 20 提示信息
14 logging.debug("調試信息開發要開着") # 10 詳細執行信息
15 logging.log(999, "自定義了一個日誌級別")
16 日誌格式
17 2018-12-21 19:52:53 - root - CRITICAL -test: 系統要爆炸
18 2018-12-21 19:52:53 - root - ERROR -test: 服務程序宕機
19 2018-12-21 19:52:53 - root - WARNING -test: 服務發生了一個警告
20 2018-12-21 19:52:53 - root - WARNING -test: 和warn同樣發生了一個警告
21 2018-12-21 19:52:53 - root - INFO -test: 提示信息
22 2018-12-21 19:52:53 - root - DEBUG -test: 調試信息開發要開着
23 2018-12-21 19:52:53 - root - Level 999 -test: 自定義了一個日誌級別
複製代碼

建立一個操做日誌的對象logger(依賴FileHandler)code

複製代碼
 1 import logging
 2 file_handler = logging.FileHandler('test.log', 'a', encoding='utf-8') # 建立文件
 3 file_handler.setFormatter(logging.Formatter(
 4     fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 設置日誌文件的格式
 5 logger1 = logging.Logger('測試程序CRM系統', level=10) # 建立一個日誌文件處理對象
 6 logger1.addHandler(file_handler)                    # 把文件添加到日誌
 7 logger1.error("這是測試程序CRM系統調試debug日誌")
 8 日誌格式
 9 2018-12-21 20:03:09,148 - 測試程序CRM系統 - ERROR -test: 這是測試程序CRM系統調試debug日誌
10 
11 
12 file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8')
13 file_handler2.setFormatter(logging.Formatter(
14     fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
15 logger2 = logging.Logger('自動化系統', level=logging.DEBUG)
16 logger2.addHandler(file_handler2)
17 logger2.error("這個自動化系統調試DEBUG日誌")
18 日誌格式
19 2018-12-21 20:03:09,148 - 自動化系統 -ERROR -test: 這個自動化系統調試DEBUG日誌
20 
21 
22 事例
23 import logging
24 file_handler = logging.FileHandler('test.log', 'a', encoding='utf-8') # 建立文件
25 file_handler.setFormatter(logging.Formatter(
26     fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 設置日誌文件的格式
27 logger1 = logging.Logger('測試程序CRM系統', level=10) # 建立一個日誌文件處理對象
28 logger1.addHandler(file_handler) # 把文件添加到日誌
29 logger1.error("這是測試程序CRM系統調試debug日誌")
30 
31 file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8')
32 file_handler2.setFormatter(logging.Formatter(
33     fmt="%(asctime)s - %(name)s -%(levelname)s -%(module)s: %(message)s"))
34 logger2 = logging.Logger('自動化系統', level=logging.DEBUG)
35 logger2.addHandler(file_handler2)
36 logger2.error("這個自動化系統調試DEBUG日誌")
37 
38 import traceback
39 class GenderException(Exception):
40     pass
41 
42 class Person:
43     def __init__(self,name,gender):
44         self.name = name
45         self.gender = gender
46         logger1.info(f'姓名{self.name},性別{self.gender}')
47     def xz(self):
48         print(f'{self.name}在洗澡')
49 
50 class Zt:
51     def nan(self,ren):
52         if ren.gender == '男':
53             ren.xz()
54         else:
55             raise GenderException("我這裏要的是男人")
56 
57     def nv(self,ren):
58         if ren.gender == '女':
59             ren.xz()
60         else:
61             raise GenderException("我這裏要的是女人")
62 try:
63     p1 = Person('jack','男')
64     p2 = Person('bob','女')
65     zaotang = Zt()
66     zaotang.nan(p2)
67     zaotang.nv(p1)
68 except GenderException:
69     print('走錯了')
70     logger1.error('走錯屋了')
71     logger1.error(traceback.format_exc())
72 結果
73 走錯了
74 日誌結果
75 2018-12-21 20:25:48,478 - 測試程序CRM系統 - ERROR -test: 這是測試程序CRM系統調試debug日誌
76 2018-12-21 20:25:48,478 - 測試程序CRM系統 - INFO -test: 姓名jack,性別男
77 2018-12-21 20:25:48,478 - 測試程序CRM系統 - INFO -test: 姓名bob,性別女
78 2018-12-21 20:25:48,479 - 測試程序CRM系統 - ERROR -test: 走錯屋了
79 2018-12-21 20:25:48,479 - 測試程序CRM系統 - ERROR -test: Traceback (most recent call last):
80   File "E:/Py3Practise/day01/test.py", line 46, in <module>
81     zaotang.nan(p2)
82   File "E:/Py3Practise/day01/test.py", line 35, in nan
83     raise GenderException("我這裏要的是男人")
84 GenderException: 我這裏要的是男人
相關文章
相關標籤/搜索