類的約束程序員
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: 我這裏要的是男人