裝飾器2

来源:https://www.cnblogs.com/zhangfanshixiaobai/archive/2023/09/11/17694426.html
-Advertisement-
Play Games

裝飾器 裝飾器的簡易版本 import time def index(): time.sleep(3) print('from index') def home(): print('from home') def func(): print('from func') def outer(func_n ...


裝飾器

裝飾器的簡易版本

import time
def index():
    time.sleep(3)
    print('from index')
    
    
def home():
    print('from home')
    
def func():
    print('from func')
    
    
def outer(func_name): 
    # func_name = index 
    def get_time():
        # 1. 函數執行之前打一個時間點
        start_time = time.time()
        func_name() # index() home()


        # 2. 在函數執行之後,在打一個時間點
        end_time = time.time()

        print('總共執行了:%s' % (end_time - start_time))
	return get_time

# get_time(index)
# get_time(home)

index=outer(index)  # res=get_time
index() # get_time()

裝飾器解決參數問題

import time
def index():
    time.sleep(3)
    print('from index')
    
    
def home(name, u, a):
    print('from home')
    return 'from home'
def func():
    print('from func')
    
    
def outer(func_name): 
    # func_name = index 
    def get_time(*args, **kwargs): args=() kwargs={'username':jerry, 'age':18}
        # 1. 函數執行之前打一個時間點
        
        start_time = time.time()
        func_name(*args, **kwargs) # index() home()
        res=func_name(name, username='jerry', age=18) # index() home()


        # 2. 在函數執行之後,在打一個時間點
        end_time = time.time()

        print('總共執行了:%s' % (end_time - start_time))
        return res
	return get_time

# get_time(index)
# get_time(home)

index=outer(index)  # res=get_time
index() # get_time()


home=outer(home)  # res=get_time
res=home('kevin', username='jerry', age=18) # get_time()
print(res) #  None


"""認證登錄的裝飾器,當你訪問函數的時候,必須登錄之後才能夠訪問!"""

裝飾器的固定模板

def index():
    pass


def outer(func_name):
    def inner(*args, **kwargs):
        '''添加一些函數執行之前的功能'''
        res=func_name(*args, **kwargs) # 這個就是執行的真正的函數
        '''添加一些函數執行之後的功能'''
        return res
    
    return inner

'''裝飾器本質上還是函數!'''

@outer
@outer # index=outer(index)
def index():
    pass

# index=outer(index)
index()

"""
1. 語法糖的書寫規範
	@裝飾器名字
	把語法糖緊貼著寫在函數的頭部
2. 裝飾器原理:
	把被裝飾對象當成函數的參數傳遞給裝飾器的形參
"""

雙層語法糖

import time


def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)  # 只能夠統計index函數的時間
        end_time = time.time()
        print('執行時間:%s' % (end_time - start_time))
        return res

    return get_time

def login_auth(func):
    # func = index
    def auth():
        username = input('username:>>>').strip()
        password = input('password:>>>').strip()
        # 2. 比較用戶名和密碼
        if username == 'jerry' and password == '123':
            # 執行函數
            print('登錄成功')
            func()
        else:
            print('用戶名或者密碼錯誤')
    return auth

@login_auth # index=login_auth(get_time) # index=auth
@outer      # get_time=outer(index)
def index():
    time.sleep(3)
    print('from index')

index() # auth()

三層語法糖(多層)

# 判斷七句print執行順序
def outter1(func1):
    print('載入了outter1')
    def wrapper1(*args, **kwargs):
        print('執行了wrapper1')
        res1 = func1(*args, **kwargs)
        return res1
    return wrapper1

def outter2(func2):
    print('載入了outter2')
    def wrapper2(*args, **kwargs):
        print('執行了wrapper2')
        res2 = func2(*args, **kwargs)
        return res2
    return wrapper2

def outter3(func3):
    print('載入了outter3')
    def wrapper3(*args, **kwargs):
        print('執行了wrapper3')
        res3 = func3(*args, **kwargs)
        return res3
    return wrapper3


@outter1
@outter2
@outter3
def index():
    print('from index')
index()

裝飾器的修複技術(瞭解)

import time

from functools import wraps
def outer(func):
    @wraps(func) # 修複技術
    def get_time():
        start_time = time.time()
        func()  # 只能夠統計index函數的時間
        end_time = time.time()
        print('執行時間:%s' % (end_time - start_time))
    return get_time

# @outer  # index=outer(index)
def index():
    print('from index')

'''修複技術就是為了讓裝飾器偽裝的更像'''
# index()
# print(index) # <function index at 0x000002F69849A940>
# print(index) # <function index at 0x000002F69849A940>
# help(index)


@outer
def home():
    '''這是home函數'''

help(home)

有參裝飾器(重要)



def outter(source_type, *args1, **kwargs1):
    # 'file', 1, 2, 3, 4, 5, 6,
    # source_type = 'file'
    def login_auth(func):  # 參數個數只能有一個
        def auth(*args, **kwargs): #
            username = input('username:>>>').strip()
            password = input('password:>>>').strip()
            # 2. 比較用戶名和密碼
            """
                1. 文件中獲取用戶名和密碼
                2. 從MySQL中獲取用戶名和密碼
                3. 從oracle中獲取用戶名和密碼
                4. 從postgresql中獲取用戶名和密碼
            """
            # print(a, b, c, d, e, f)
            if source_type == 'file':
                print('文件中獲取用戶名和密碼')
            elif source_type == 'mysql':
                print('從MySQL中獲取用戶名和密碼')
            elif source_type == 'oracle':
                print('從oracle中獲取用戶名和密碼')
            elif source_type == 'postgresql':
                print('從postgresql中獲取用戶名和密碼')

            if username == 'jerry' and password == '123':
                # 執行函數
                print('登錄成功')
                func(source_type, *args, **kwargs)
            else:
                print('用戶名或者密碼錯誤')
        return auth
    return login_auth

@outter('file', 1, 2, 3, 4, 5, 6,) # login_auth(home, file)
# @login_auth # login_auth(home, file)
def home():
    pass

home('mysql')

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

-Advertisement-
Play Games
更多相關文章
  • 介紹 ESLint 是一個根據方案識別並報告 ECMAScript/JavaScript 代碼問題的工具,其目的是使代碼風格更加一致並避免錯誤。在很多地方它都與 JSLint 和 JSHint 類似,除了: ESLint 使用 Espree 對 JavaScript 進行解析。 ESLint 在代碼 ...
  • 1. 安裝 vue-i18n npm i vue-i18n -S 2. 創建一個i8n的配置文件 如:i18nConfig.js // 配置 vue-i18n 實現國際化語言設置 import { createI19n } from 'vue-i18n' import zh_cn from '../ ...
  • 最近系統學習了vue.js 的官方腳手架create-vue的源碼,深入分析了裡面的技術實現細節,本文是我整理的源碼學習文章。 ...
  • 很早之前,就寫過一篇與原生嵌套相關的文章 -- CSS 即將支持嵌套,SASS/LESS 等預處理器已無用武之地?,彼時 CSS 原生嵌套還處於工作草案 Working Draft (WD) 階段,而今天(2023-09-02),CSS 原生嵌套 Nesting 終於成為了既定的規範! CSS 原生 ...
  • 淺拷貝 當我們想要複製一段數據的時候嗎,我們就會用到拷貝;拷貝數據又分為了淺拷貝和深拷貝,淺拷貝指複製對象或數組的頂層結構,如果對象或數組中有引用類型的屬性值,複製的是引用(地址)而非值;而深拷貝則是遞歸複製完整的對象或數組,包括嵌套的子對象或子數組,生成一個全新的對象,新對象和原對象的引用地址不同 ...
  • 前言 大家好,我是 god23bin,今天我們來聊一聊 Spring 框架中的 Bean 作用域(Scope)。 什麼是 Bean 的作用域? 我們在以 XML 作為配置元數據的情況下,進行 Bean 的定義,是這樣的: <bean id="vehicle" class="cn.god23bin.d ...
  • 1 ★★★ 例1 : 判斷集合是否為空: 2 CollectionUtils.isEmpty(null); //控制台列印:true 3 CollectionUtils.isEmpty(new ArrayList());//控制台列印:true 4 CollectionUtils.isEmpty({ ...
  • 使用<property>標簽的value屬性配置原始數據類型和ref屬性配置對象引用的方式來定義Bean配置文件。這兩種情況都涉及將單一值傳遞給Bean。那麼如果您想傳遞多個值,例如Java集合類型,如List、Set、Map和Properties怎麼辦?為了處理這種情況,Spring提供了四種類型 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...