python裝飾器(新年第一寫)

来源:https://www.cnblogs.com/xiu123/archive/2019/01/01/10204078.html
-Advertisement-
Play Games

祭奠碌碌無為的2018,想想其實也不算碌碌無為,至少我還搞懂了裝飾器,寫了一堆有用沒用的玩意 原來覺得裝飾器挺難的,直到2018年的最後幾天,突然就明白了,難道這就是傳說中的開天聰麽 言歸正傳,之所以覺得裝飾器難,是因為這東西不按套路出牌,希望大家看完我寫的也能在新的一年裡有所收貨吧 先說下要實現的 ...


祭奠碌碌無為的2018,想想其實也不算碌碌無為,至少我還搞懂了裝飾器,寫了一堆有用沒用的玩意

原來覺得裝飾器挺難的,直到2018年的最後幾天,突然就明白了,難道這就是傳說中的開天聰麽

言歸正傳,之所以覺得裝飾器難,是因為這東西不按套路出牌,希望大家看完我寫的也能在新的一年裡有所收貨吧

先說下要實現的功能,寫一個裝飾器,讓裝飾器可以把時間加到日誌的行首,例如

20190101 000001 write log first values

20190101 000001使用裝飾器寫入,而write log first values使用函數寫入

首先寫一個正常的寫入日誌的函數

def write_log(values):
  return values

函數介紹:一段簡單的函數,只是將values寫入並返回,看起來像脫了褲子放屁,先這樣,後面調用裝飾器的時候是需要用這個函數的

測試下函數

write_values = 'write log first values'

result = write_log(write_values)

print result

正常寫入,查看文件內容

write log first values

因為需要寫入時間,所以還需要一個寫入處理時間的函數

import time
def
now_time(): local_time = time.localtime(time.time()) time_format = '%Y%m%d %H%M%S' time_result = time.strftime(time_format,local_time) return time_result

函數介紹:將當前日期轉換成需要的日期格式

測試下函數

now = now_time()

print now

結果是

20190101 013041

日期正常,再來寫個裝飾器函數

敲小黑板,這裡是重點,重點,重點,重要的事情說三遍---------------------------------------------------------

def add_time_line_start(func1):
  def insert_time():
    now = now_time()
    return now +' ' + func1()
  return insert_time

函數介紹:首先定義了一個裝飾器函數add_time_line_start,傳入了一個參數是func1,之所以說裝飾器不按套路出牌這裡是詭異地方1,這裡傳入的func1參數其實是個函數,並不是我們平常認為的一個字元串或者list什麼的,接下來是裝飾器裡面的insert_time函數,這個函數是裝飾器的功能函數,也就是裝飾器需要實現的功能在這裡實現。說一下insert_time的功能,獲取到當前時間,並且把當前時間拼到傳入的函數前面返回。最後最外層是返回inser_time函數,即將拼接好的結果返回

測試下函數,這裡需要全部的函數了,現在把全部函數都放進來,存成一個文件叫zsq.py

#!/usr/bin/python
# coding: UTF-8

import time

# 日期時間函數
def now_time():
  local_time = time.localtime(time.time())
  time_format = '%Y%m%d %H%M%S'
  time_result = time.strftime(time_format,local_time)
  return time_result

# 裝飾器函數
def add_time_line_start():
  def insert_time():
    now = now_time()
    return now + ' ' + func1()
  return insert_time

#調用裝飾器
@add_time_line_start

#看起來沒什麼用的函數
def write_log(values):
  return values

write_values = 'write log first values'
result = write_log(write_values)
print result

這裡看到了調用裝飾器是使用的@方法,@add_time_line_start,說下我的理解,這個其實就是等於平常函數的add_time_line_start(write_log())這種方法,這也就是裝飾器不按套路出牌這裡是詭異地方2

測試下

python zsq.py

結果是

Traceback (most recent call last):
  File "zshq1.py", line 28, in <module>
    print write_log(write_values)
TypeError: insert_time() takes no arguments (1 given)

卧槽,報錯了,為什麼,這也是個坑,為這個真是研究了半天,因為傳入裝飾器的函數有傳參,所以insert_time()需要同步傳參,但是傳什麼呢,這裡有個特殊用法,在函數傳參的地方寫上self就好了,下麵是改正後的結果def insert_time():   return now + ' ' + func1()註意這兩個地方

 

#!/usr/bin/python
# coding: UTF-8

import time

# 日期時間函數
def now_time():
  local_time = time.localtime(time.time())
  time_format = '%Y%m%d %H%M%S'
  time_result = time.strftime(time_format,local_time)
  return time_result

# 裝飾器函數
def add_time_line_start(func1):
  def insert_time(self):
    now = now_time()
    return now + ' ' + func1(self)
  return insert_time

#調用裝飾器
@add_time_line_start

#看起來沒什麼用的函數
def write_log(values):
  return values

def write_log1(values):
  return values

write_values = 'write log first values'
result = write_log1(write_values)
print result

 

再測試下

python zsq.py

結果是

20190101 022028 write log first values

這次OK了,安心睡覺咯,留個疑問吧,就是這個裝飾器是不是對下麵所有的函數都會復用呢,答案當然是自己動手試試咯

 


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

-Advertisement-
Play Games
更多相關文章
  • Express 基於Node.js平臺,快速、開放、極簡的web開發框架 Express特點 1. 他提供一系列強大的特性,幫助你創建各種web和移動設備應用2. 豐富的HTTP快捷方法和任意排列組合的Connect中間件,讓你創建健壯、友好的API變得即快速又簡單3. Express不對Node. ...
  • 瀏覽器端js是單線程執行,所以當js執行高負載運算時,UI渲染就會阻塞,頁面就會出現卡頓,用戶體驗就不是很好 js為此也提供了非同步操作,例如: 定時器(setTimeout 和 setInterval),Ajax請求等,但非同步終究還是單線程,不能從根本上解決問題,像setTimeout並不能拿到正確 ...
  • /.事件響應刷新:有請求才會刷新 1、通過JS HTML DOM或jQuery獲取HTML元素,通過DOM方法或jQuery方法監聽頁面事件,獲取用戶請求; 2、通過Ajax將用戶請求提交至伺服器,伺服器處理後返回結果,再由Ajax接收數據; 3、通過DOM方法或jQuery方法將數據載入頁面,事件 ...
  • 目標效果:點擊頁面按鈕,顯示模態對話框,在模態對話框里點擊取消關閉模式對話框。 效果如下 實現代碼如下: ...
  • 以上為效果圖 HTML代碼: CSS樣式: jQuery代碼: jquery.js slide.js 如果感覺還不錯,麻煩給個小心心。 ...
  • 受油猴子上的作者cherry製作的“網頁滑鼠點擊特效”啟發,於是稍加修改和製作,完成了Steam Wallpaper Engine版本的桌面滑鼠點擊特效。 Steam鏈接🔗:https://steamcommunity.com/sharedfiles/filedetails/?id=1609057 ...
  • 1.mvvm和mvc區別?它和其它框架(jquery)的區別是什麼?哪些場景適合? 2.vue的優點是什麼? 3.vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎? 4.請列舉出3個Vue中常用的生命周期鉤子函數? 5.vue如何自定義一個過濾器? ...
  • 中介者模式是用來降低多個對象和類之間的通信複雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,並支持松耦合,使代碼易於維護。 前言 中介者模式屬於行為者模式,通過一個中介對象來封裝一些列的對象交互,使對象之間解耦和,降低系統複雜度。 類圖描述 代碼實現 1、創建中介類 2、創建實體 3、 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...