1. 程式人生 > >python約束 異常 MD5 日誌處理

python約束 異常 MD5 日誌處理

一.約束

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("????")     # 哪裡需要記錄日誌就放到哪裡,要設定等級