python約束 異常 MD5 日誌處理
阿新 • • 發佈:2018-12-21
一.約束
1.用父類執行約束
子類繼承父類,用重寫方法,對子類的方法進行約束.
class Foo: def login(self): # 對子類進行約束,該方法需要重寫 # 沒有執行的錯誤 raise NotImplementedError ("login重寫") # 丟擲 NotImplementedError錯誤 class Member(Foo): def login(self): print("我是普通登陸") class BaWu(Foo): def login(self): print("我是吧務登陸") class HouTai(Foo): def denglu(self): print("我是後臺登陸") def fn(obj): obj.login() m = Member() bw = BaWu() ht = HouTai() fn(m) fn(bw) fn(ht)
2.定義抽象類進行約束
抽象類中的抽象方法不能執行,報錯約束
from abc import ABCMeta ,abstractmethod #匯入抽象類模組 class Foo(metaclass=ABCMeta): # 定義一個抽象類 元類 @abstractmethod # 定義一個 抽象方法 def login(self):pass def back(self): # 抽象類中可以寫正常方法 print("退出登陸") class Member(Foo): def login(self): print("我是普通登陸") class BaWu(Foo): def login(self): print("我是吧務登陸") class HouTai(Foo): def denglu(self): print("我是後臺登陸") def fn(obj): obj.login() m = Member() bw = BaWu() ht = HouTai() fn(m) fn(bw) fn(ht) m.back()
抽象類總結:
1.子類必須重寫父類的方法,否則子類也是抽象類
2.抽象類不能建立物件
3.有抽象方法的類,就是抽象類
4.抽象類可以有方法
二.異常處理
1.處理異常錯誤
格式 try...except...
try: # 處理異常 try ... except... print(1/0) except ZeroDivisionError:
print("0不能做除數")
print("hah")
try: print(1/0) except Exception: # 可以處理所有錯誤,一般在最下面兜底用 print("我能攔截下面嗎") except ZeroDivisionError: print("0不能做除數")
格式 try...except...except...else...finally
try: # print(1/0) f = open("dssadas",mode="r") except ZeroDivisionError: print("0不能做除數") except FileNotFoundError: print("找不到檔案") except Exception: # 可以處理所有錯誤,一般在最下面兜底用 print("我能兜底") else: # 當try中的程式碼不產生任何錯誤的時候,會自動執行else裡的程式碼 print("沒有出錯?") # 這裡一般放pass finally: # 最終,不管出錯還是不出錯,都要執行最後的finally print("哈哈哈")
2.自定義異常
因為所有的異常類都繼承Exception 所以寫一個繼承Exception的異常類就行
使用 raise 丟擲異常
class CulException(Exception): pass # 怎麼手動丟擲自己的異常 def cul(a,b): if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float): return a + b else: # raise 丟擲 raise 異常類(錯誤資訊) raise CulException("這是自己定義的異常類,丟擲") print(cul("sdf",25))
3.檢視堆疊
可以檢視到具體某一行出錯
import traceback class GenderException(Exception): pass class Person: def __init__(self,name,gender): self.name = name self.gender = gender def xizao(self): print(f"{self.name}在洗澡") def man_zaotang(t): if t.gender == "男": t.xizao() else: raise GenderException("進錯了") # 丟擲異常很重要 try: p = Person("小明","女") man_zaotang(p) except GenderException: ret = traceback.format_exc() # 檢視堆疊資訊,看錯誤資訊的 print(ret)
三.MD5加密
匯入模組使用,不可逆的一種加密方式
import hashlib def my_md5(s): obj = hashlib.md5(b"dasds") # 加鹽 防止被破解 obj.update(s.encode("utf-8")) # 給s字串加密 return obj.hexdigest() # 獲取密文 uname = input("使用者名稱:") upwd = input("密碼:") if uname == "admin" and my_md5(upwd) == "f5cb18dbc8aae8b87c9129ff3156e0d5": print("登陸成功") else: print("帳號或者密碼錯誤")
四.日誌處理
日誌一般不需要更改很多,只需要設定引數,有模板
1.單一日誌模板
import logging # 單一專案模組 logging.basicConfig( filename="1.log", # 把日誌資訊寫入的檔名 # 時間 等級名 模組名 寫入資訊 format="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S", # level=40 # 設定等級 超過這個的都寫入日誌 ) # 向日志文件寫入內容 logging.critical("我幾乎是最高等級50") logging.error("我是錯誤,等級40") logging.warning("我是警告,等級30") logging.info("我是提示,等級20") logging.debug("我是debug,等級10") logging.log(600,"寫入內容")
2.多個日誌模板
import logging file_handler = logging.FileHandler("2.log","a","utf-8") # 建立日誌檔案 file_handler.setFormatter( logging.Formatter( # 日誌格式 fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) logger1 = logging.Logger("dnf",level=10) # 設定日誌處理物件和等級 logger1.addHandler(file_handler) # 把檔案新增到日誌 logger1.error("看看錯誤") # 錯誤資訊 file_handler2 = logging.FileHandler("3.log","a","utf-8") file_handler2.setFormatter( logging.Formatter( fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s" ) ) logger2 = logging.Logger("lol",level=logging.DEBUG) logger2.addHandler(file_handler2) logger2.critical("????") # 哪裡需要記錄日誌就放到哪裡,要設定等級