1. 程式人生 > >Python 18 約束和異常處理

Python 18 約束和異常處理

約束和異常

1.類的約束

  1. 提取父類. 然後在子類中定義好方法. 在這個方法中什麼都不用幹. 就拋一個異
    常就可以了. 這樣所有的子類都必須重寫這個方法. 否則. 訪問的時候就會報錯
  2. 使用元類來描述父類. 在元類中給出一個抽象⽅法. 這樣子類就不得不給出抽象
    方法的具體實現. 也可以起到約束的效果.

方法一 ↓↓↓

def login(self):
 raise Exception("你沒有實現login⽅法()")
class Normal(Base):
 def
login(self): pass class Member(Base): def denglu(self): pass class Admin(Base): def login(self): pass # 專案經理寫的總入口 def login(obj): print("準備啟動程式.......") obj.login() print("進入主程式.......") n
= Normal() m = Member() a = Admin() login(n) login(m) # 報錯. login(a)

方法二 ↓↓↓
寫抽象類和抽象方法.
需要引入abc模組中的 ABCMeta 和 abstractmethod

from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
  @abstractmethod
  def login(self):
  pass
class Normal(Base):
  def loin(self):
  pass
class Member(Base):
 def denglu(self): # 這個就沒用了
 pass
 def login(self): # 子類對父類進行實現
 pass
class Admin(Base):
 def login(self):
 pass
def login(obj): print("準備進入程式.......") obj.login() print("進入主程式.......") n
= Normal() m = Member() a = Admin() login(n) login(m) login(a)

1). 使用抽象類和抽象方法, 由於該方案來源是java和c#. 所以使用頻率還是很少的

2). 使用人為丟擲異常的方案. 並且儘量丟擲的是NotImplementError. 這樣比較專

業, 而且錯誤比較明確.(推薦)

2.異常處理

def num():
    return a/b
rt = num(2,0)
print(rt)    #  直接報錯

上面就直接報錯了,除數不能是0

def num():
    return a/b
try:
    rt = num(2,0)
    print(rt)
except Exception as e:
    print("除數不能是0")

直接將報錯結果變成 除數不能是0
用 try 和 except攔截異常,並將異常物件拋給e

3.自定義異常

只要你的類繼承了Exception類. 那你的類就是一個異常類.

class GenderError(Exception):
    pass
class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
def nan_zao_tang_xi_zao(person):
    if person.gender != "男":
        raise GenderError("性別不對. 這裡是男澡堂子")	
p1 = Person("alex", "男")
p2 = Person("eggon", "蛋")
# nan_zao_tang_xi_zao(p1)
# nan_zao_tang_xi_zao(p2) # 報錯. 會丟擲一個異常: GenderError
# 處理異常
try:
    nan_zao_tang_xi_zao(p1)
    nan_zao_tang_xi_zao(p2)
except GenderError as e:
    print(e) # 性別不對, 這⾥是男澡堂⼦
except Exception as e:
    print("反正報錯了")

4.MD5加密

MD5是一種不可逆的加密演算法. 它是可靠的. 並且安全的. 在python中我們不需要手寫
這套演算法. 只需要引入一個叫hashlib的模組就能搞定MD5的加密工作

import hashlib
obj = hashlib.md5()
obj.update("alex".encode("utf-8")) # 加密的必須是位元組
miwen = obj.hexdigest()
print(miwen) # 534b44a19bf18d20b71ecc4eb77c572f

可是上面這樣的加密是不安全的, 很容易會產生撞庫
看下面

import hashlib
obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf") # 加入這些就安全了
obj.update("alex".encode("utf-8")) # 加密的必須是位元組
miwen = obj.hexdigest()
print(miwen) # 99fca4b872fa901aac30c3e952ca786d

加密的應用

import hashlib
def my_md5(s):
    obj = hashlib.md5(b"fjlksajflkjasfsalwer123dfskjf")
    obj.update(s.encode("utf-8")) # 加密的必須是位元組
    miwen = obj.hexdigest()
    return miwen
username = input("請輸入使用者名稱:")
password = input("請輸入密碼:")	
if username == "wusir" and my_md5(password) =="99fca4b872fa901aac30c3e952ca786d":
    print("成功")
else:
    print("失敗")

5.日誌

  1. 匯入logging模組.
  2. 簡單配置一下logging
  3. 出現異常的時候(except). 向日志裡寫錯誤資訊.
logging.basicConfig(filename='x1.txt',
 format='%(asctime)s - %(name)s - %(levelname)s -%
(module)s: %(message)s',
 datefmt='%Y-%m-%d %H:%M:%S',
level=0) # 當前配置表示 10以上的分數會被寫入檔案
logging.critical("我是critical") # 50分. 最貴的
logging.error("我是error") # 40分
logging.warning("我是警告") # 警告 30
logging.info("我是基本資訊") # 20
logging.debug("我是除錯") # 10
logging.log(2, "我是自定義") # 自定義. 看著給分

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0