約束,自定義異常,加密,日誌

来源:https://www.cnblogs.com/qicun/archive/2018/08/31/9566524.html
-Advertisement-
Play Games

一丶約束 當我們編寫項目時會創建很多個類,來實現很多個功能,最後又需要把這些類都聯繫成一個,我們就需要來約束一下那些類中的方法,把需要聯繫的約束成一個方法. Email類繼承了BaseMessage,所以Email類中必須有send方法,否則就會報錯,我們用這樣的來約束類 編寫. 示例: class ...


 一丶約束

  當我們編寫項目時會創建很多個類,來實現很多個功能,最後又需要把這些類都聯繫成一個,我們就需要來約束一下那些類中的方法,把需要聯繫的約束成一個方法.

class BaseMessage(object):
    def send(self,x1):
        """
        必須繼承BaseMessage,然後其中必須編寫send方法。用於完成具體業務邏輯。
        """
        raise NotImplementedError(".send() 必須被重寫.")

class Email(BaseMessage):
    def send(self,x1):
        """
        必須繼承BaseMessage,然後其中必須編寫send方法。用於完成具體業務邏輯。
        """
        pass
obj = Email()
obj.send(1)

 

   Email類繼承了BaseMessage,所以Email類中必須有send方法,否則就會報錯,我們用這樣的來約束類 編寫.

示例:

class BaseMessage(object):
    def send(self):
        """
        必須繼承BaseMessage,然後其中必須編寫send方法。用於完成具體業務邏輯。
        """
        raise Exception()

class Email(BaseMessage):
    def send(self):
        pass # 發送郵件

    def f1(self):
        pass

    def f2(self):
        pass
class Wechat(BaseMessage):
    def send(self):
        pass # 發送微信

    def f1(self):
        pass

    def f2(self):
        pass
class Msg(BaseMessage):
    def send(self):
        pass # 發送簡訊

    def f1(self):
        pass

    def f2(self):
        pass


def func(arg):
    """
    報警通知的功能
    """
    arg.send()


obj = Msg()
func(obj)
示例

 

   抽象類和抽象方法約束:

from abc import ABCMeta,abstractmethod

class Base(metaclass=ABCMeta): # 抽象類

    def f1(self):
        print(123)

    @abstractmethod
    def f2(self):   # 抽象方法
        pass

class Foo(Base):

    def f2(self):
        print(666)

obj = Foo()
obj.f1()

  其它語言中的介面:

    介面,介面中不允許在方法內部寫代碼,只能約束繼承它的類必須實現介面中定義的所有方法。

偽代碼:
interface IFoo:

    def f1(self,x1):pass

    def f2(self,x1):pass

interface IBar:

    def f3(self,x1):pass

    def f4(self,x1):pass

class Foo(IFoo,IBar):# 實現了2個介面

    def f1(self,x1):pass

    def f2(self,x1):pass

    def f3(self,x1):pass

    def f4(self,x1):pass

 

   總結:

    1.什麼是介面以及其作用?

      介面是一種數據類型,主要用於約束派生類中必須實現指定的方法.

      python中不存在,Java和C#中是存在的

    2.Python中使用過什麼來約束呢?

      抽象類+抽象方法,在編寫上會很麻煩.

      人為主動拋出異常

    3.約束時,拋出的異常是否可以用其它的?

      不專業:  raise Exception(".send() 必須被重寫.")

       專業:raise NotImplementedError(".send() 必須被重寫.")

 

應用場景:

  多個類,內部都必須有某些方法時,需要使用基類+異常進行約束

  

二丶自定義異常

  有時我們需要使程式跟我們預定的流程走時,我們可以自定義異常來約束它.

# 知識點:如何自定義異常類?
class MyException(Exception):
    def __init__(self,code,msg):
        self.code = code
        self.msg = msg
try:
    # 知識點:主動拋出異常
    raise MyException(1000,'操作異常')

except KeyError as obj:
    print(obj,1111)
except MyException as obj: # 知識點:捕獲異常
    print(obj,2222)
except Exception as obj:
    print(obj,3333)

 

 三丶加密

   以前我們編寫註冊程式時,都是以明文的方式將密碼寫入文檔的,這樣很不安全,一旦文檔被盜取,將會發生不可估量的損失.我們就需要將密碼存儲時進行加密,然後將密文存入文檔,因為密文是無法被反解的,這樣當被人拿到文檔中的密文時也無法破解我們用戶的真正的密碼信息.

import hashlib
def md5(pwd):
    # 實例化對象
    obj = hashlib.md5()
    # 寫入要加密的位元組
    obj.update(pwd.encode('utf-8'))
    # 獲取密文
    return obj.hexdigest()

user = input("請輸入用戶名:")
pwd = input("請輸入密碼:")
print(md5(pwd)) #21232f297a57a5a743894a0e4a801fc3

  我們編寫登錄程式時又需要把密碼從文檔中拿出來,但是拿到的是密文,密文又沒法反解,我們應該怎麼驗證用戶的密碼呢?我們可以把用戶輸入的密碼用同樣的方式加密一遍,然後把加密的密碼跟從文檔讀出來的密碼密文比較,相等時登陸成功

import hashlib
def md5(pwd):
    # 實例化對象
    obj = hashlib.md5()
    # 寫入要加密的位元組
    obj.update(pwd.encode('utf-8'))
    # 獲取密文
    return obj.hexdigest()

user = input("請輸入用戶名:")
pwd = input("請輸入密碼:")
if user == 'oldboy' and md5(pwd) == '21232f297a57a5a743894a0e4a801fc3':
    print('登錄成功')
else:
    print('登錄失敗')

 

 

  密碼加密後雖然說是無法反解的,那為什麼有人能破解呢?其實他們用大量欄位段加密後的密文來跟我們的密文把比較來獲取加密前的內容,我們可以防止這樣的事情發生,可以在密碼加密時再加嚴一層.

SALT = b'2erer3asdfwerxdf34sdfsdfs90'

import hashlib
def md5(pwd):
    # 實例化對象
    obj = hashlib.md5(SALT)
    # 寫入要加密的位元組
    obj.update(pwd.encode('utf-8'))
    # 獲取密文
    return obj.hexdigest()

user = input("請輸入用戶名:")
pwd = input("請輸入密碼:")       #21232f297a57a5a743894a0e4a801fc3
if user == 'oldboy' and md5(pwd) == 'c5395258d82599e5f1bec3be1e4dea4a':
    print('登錄成功')
else:
    print('登錄失敗')

 

 

  這樣,同樣的密碼,但是加密後的結果不一樣,那些人是無法通過撞庫撞出來真正的密碼的,密碼的安全性就會大大提高

四丶日誌

  當我們程式推廣給用戶時,用戶並不知道我們程式應該遵循怎樣的運行規則,就有很大的幾率產生錯誤信息,當他們向我們反饋時,我們又不知道哪裡錯了,這裡就需要一個日誌文件來把用戶的錯誤都記錄下來,方便我們知道哪裡錯了.

import logging

logger = logging.basicConfig(filename='rizhi.txt',
                             format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                             datefmt='%Y-%m-%d %H:%M:%S',
                             level=30)  #level 將大於等於30的錯誤級別寫入日誌中
logging.debug('x1') # 10
logging.info('x2')  # 20
logging.warning('x3') # 30
logging.error('x4')    # 40
logging.critical('x5') # 50
logging.log(10,'x6')

 

  如何將錯誤信息具體到哪一行來寫到日誌中呢?

import logging

logger = logging.basicConfig(filename='rizhi.txt',
                             format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                             datefmt='%Y-%m-%d %H:%M:%S',
                             level=30)
import traceback

def func():
    try:
        a = a +1
    except Exception as e:
        # 獲取當前錯誤的堆棧信息
        msg = traceback.format_exc()
        logging.error(msg)
func()

 

  當我們要將不同的錯誤信息寫入不同的文件中呢?

import logging

# 創建一個操作日誌的對象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('s1', level=logging.ERROR)
logger1.addHandler(file_handler)

logger1.error('123123123')



# 在創建一個操作日誌的對象logger(依賴FileHandler)
file_handler2 = logging.FileHandler('l2.log', 'a', encoding='utf-8')
file_handler2.setFormatter(logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s"))

logger2 = logging.Logger('s2', level=logging.ERROR)
logger2.addHandler(file_handler2)

logger2.error('666')

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 《C語言實例解析精粹》中編譯環境採用的是Turbo C 2.0。但是這個編譯器年代久遠,較新的編譯器對書中的某些例子支持不好,在學習的時候同時做一些筆記。 實例18:將一個無符號整數轉換為任意d進位(d在2~16之間)。 主要思路:對無符號整數n求d的餘數,就能得到n的d進位的最低位數字,重覆上述步 ...
  • 學習了類的繼承,今天說一下當父類與子類中有同名函數和變數時那麼程式將怎麼執行。首先明確當基類和子類有同名函數或者變數時,子類依然從父類繼承。 舉例說明: 常式說明: 父類和子類有同名的成員 data;同名函數printfa(); 子類增加兩個列印函數:void son_data();void fat ...
  • 單利模式的核心點在於只能生成1個對象,並且是由類中的靜態變數保存。以下代碼來自《深入PHP 面向對象、模式與實踐》(第三版)第9章/** * Created by PhpStorm. * User: Eilen * Date: 2018/8/31 * Time: 22:48 */class Pref ...
  • SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程式。 1、SpringMVC的請求過程 1)請求離開瀏覽器,並攜帶用戶所請求的內容 2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器 3)將請求發給選 ...
  • 1、java學習的極佳博客: 1)https://www.cnblogs.com/xdp-gacl (主要包含JavaWeb,java基礎,JavaScript基礎,MyBatis,Servlet3.0) 2)https://www.cnblogs.com/mq0036 (主要包含oracle,前端 ...
  • 一、應用場景 1.在本地測試微信支付回調 二、如何使用natapp實現內網穿透 1.第一步註冊賬號併進行實名制認證 natapp網站地址 https://natapp.cn/ 2.第二步申請免費隧道並配置你的埠 3.下載客戶端 解壓: 4.複製你的隧道的authtoken並使用終端運行 打開終端c ...
  • Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and the owner of the maze neglected to create a fire escape plan. Help J ...
  • 輸入輸出樣例 輸入樣例#1: 8 186 186 150 200 160 130 197 220 輸出樣例#1: 4 輸入樣例#1: 8 186 186 150 200 160 130 197 220 輸出樣例#1: 4 此題意在先升後降子序列,單調遞增子序列,單調遞減子序列當中找到最長的一組序列。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...