python -- 約束、異常處理、MD5

一、類的約束
 
    一、寫一個父類,父類中的某個方法要拋出一個異常 NotImplementedError
class Base:
    # 對子類進行了約束,必須重寫該方法
    def login(self):
        # 沒有被實現錯誤
        raise NotImplementedError('請重寫login這個方法')  # 拋異常

class Nomal(Base):
    def login(self):
        pass

class Member(Base):
    def login(self):
        pass

class Admin(Base):
    def denglu(self):  # 報錯,上層程序員沒有按照規範來寫代碼
        pass

# 項目經理寫的總入口,整合這些功能
def login(obj):
    print('準備驗證碼...')
    obj.login()
    print('進入主頁...')

n = Nomal()
m = Member()
a = Admin()
login(n)
login(m)
login(a)  # 報錯
View Code

二、抽象類和抽象方法java

from abc import ABCMeta, abstractmethod
class Base(metaclass = ABCMeta):
    @abstractmethod
    def fangfa(self):
        pass

 

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

# 寫一個抽象方法:導入一個模塊
from abc import ABCMeta, abstractmethod

# 此時抽象類不能建立對象
class Animal(metaclass = ABCMeta):
    @abstractmethod #抽象方法
    def eat(self): pass

    # 抽象類中能夠有正常的方法
    def run(self):
        print('')

# 子類必須實現父類中的抽象方法,不然子類也是抽象類,抽象類不能建立對象
# class Cat(Animal): # 此時貓裏面也有一個抽象方法,此時的貓是建立不了對象的
#     pass

class Cat(Animal):
    def eat(self):
        print('貓喜歡吃魚')

a = Cat()
a.eat()
a.run()
    總結:約束,其實就是父類對子類進行約束,子類必需要寫***方法
 
    一、使用抽象類和抽象方法,因爲該方法的來源是java和c#,因此使用頻率仍是不多的
    二、使用人爲拋出異常的方案,而且精良拋出的是NotImplementedError,這樣比較專業,並且錯誤比較明顯。
 
二、異常處理  try except raise
#經常使用異常
AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x
IOError 輸入/輸出異常;基本上是沒法打開文件
ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,致使你覺得正在訪問它
ValueError 傳入一個調用者不指望的值,即便值的類型是正確的
異常是程序在運行過程當中產生的錯誤,語法上的錯誤跟異常處理無關,必須在程序運行前就修正.
if判斷式的異常處理
 
if判斷式的異常處理只能針對某一段代碼,對於不一樣代碼段的相同類型的錯誤,則須要寫重複的if判斷,在程序中頻繁的寫魚程序自己無關,與異常處理有關的if,可讀性及其差。
try:
    代碼
except 異常類:
    出了錯,如何處理異常
except 異常類:
    出了錯,如何處理異常
except 異常類:
    出了錯,如何處理異常

else:
    當程序不出錯
finally:
    無論出不出錯都要執行
try:
    print(1/0)
    f = open("哈哈", mode = 'r')
    d = {[]:123}
except ZeroDivisionError:  
    print('除以0出錯了')
except FileNotFoundError:
    print('文件不存在的錯誤')
except Exception:  # 兜底的
    print('其餘錯誤')
else: # 當try中的代碼不產生任何錯誤的時候,會自動地執行else裏的代碼
    pass
finally:# 最終,無論出錯,仍是不出錯,都要執行最後的finally,通常用來收尾
    print('哈哈哈哈哈')
raise 異常類(「信息」)
 
如何本身定義異常
class 類(Exception):
    pass
# 如何本身定義異常
# 隨便寫一個類,這個類只要繼承類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 CulException("沒法處理這樣的運算")

print(cul('aa',2))
堆棧  (錯誤信息叫堆棧信息)
import traceback
traceback.format_exc()
 
#  會員買東西
import traceback  # 用來查看堆棧信息

class MemberException(Exception):
    pass

class Person:
    def __init__(self,name,ismember):
        self.name = name
        self.ismember = ismember

    def buy(self):
        print(f"{self.name}在買東西")

def place(ren):
    if ren.ismember == '是會員':
        ren.buy()
    else:
        raise MemberException("不是會員,快去辦會員吧")

try:
    p1 = Person('zhangmeng','是會員')
    p2 = Person('zhouyou','不知道')
    place(p1)
    place(p2)
except MemberException:
    ret = traceback.format_exc()  # 查看對戰信息,錯誤在那裏
    print(ret)
    print('出錯了')

 

使用try ... except的異常處理的好處
一、把錯誤處理和真正的工做分開
二、代碼更易組織,更清晰,負責的工做任務更容易實現
三、更安全,不至於由於一些小的錯誤致使整個程序崩盤。
 
注:try...except 儘可能少用,它自己就是附加給程序的一種異常處理的邏輯,與工做無關,過多會致使代碼可讀性變差,
 
三、Md5加密
import hashlib  # MD5須要導入這個模塊
 # 加密的內容(須要的是字節類型)   
obj = hashlib.md5(b'')
obj.update('123456'.encode('utf-8')) # 把要加密的內容給md5
print(obj.hexdigest()) # 拿到密文
# 加密,不可逆
import hashlib
# 我本身的md5對象
def my_md5(s):
    obj = hashlib.md5(b"dhadkfkfnsgadsjndzjb") # 加鹽
    obj.update(s.encode("utf-8")) # 把要加密的內容給md5
    return obj.hexdigest()

# print(my_md5("12345"))
# 9246295b87d00ec028dfec692efb55c0

username  = 'hutong'
password = '9246295b87d00ec028dfec692efb55c0'

# 登錄
uname = input('請輸入你的用戶名:')
upwd = input('請輸入你的密碼:')
if uname == username and my_md5(upwd) == password:
    print('登錄成功')
else:
    print('登錄失敗')
應用
四、日誌處理
 
    等級:
        critical:50  幾乎是最高的
        error:40  平時使用最多
        warning:30  警告
        info:20    提示
        debug:10
 
import logging
# 配置好日誌的處理, 默認就是GBK
logging.basicConfig(filename='x1.txt', # 把日誌信息寫入的文件名
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S', # 時間的格式
                    level=40) # 當前配置表示 10以上的分數會被寫入日件


# 建立一個操做日誌的對象logger(依賴FileHandler)
file_handler = logging.FileHandler('l1.log', 'a', encoding='utf-8') # 建立文件
file_handler.setFormatter(logging.Formatter(
    fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")) # 設置日誌文件的格式
logger1 = logging.Logger('騰訊qq', level=10) # 建立一個日誌文件處理對象
logger1.addHandler(file_handler) # 把文件添加到日誌

logger1.error("麻花藤明天請你們吃飯. 去不去?")

import traceback

class GenderException(Exception):
    pass


class Person:
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
        logger1.info(f"這我的的名字是{self.name}, 這我的的性別是:{self.gender}")

    def xizao(self):
        print(f"{self.name}在洗澡")

class ZaoTang:

    def nan(self, ren):
        if ren.gender == "":
            ren.xizao()
        else:
            raise GenderException("這裏要的是男人")

    def nv(self, ren):
        if ren.gender == "":
            ren.xizao()
        else:
            raise GenderException("這裏要的是男人")

try:
    p1 = Person("zhaoyalei", "")
    p2 = Person("linmei", "")
    zaotang = ZaoTang()
    zaotang.nan(p2)
    zaotang.nv(p1)
except GenderException:
    print("走錯屋了")
    logger1.error("走錯屋了.. ")
    logger1.error(traceback.format_exc()) # 把堆棧信息記錄在日誌文件中
例子
相關文章
相關標籤/搜索