成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記-裝飾器

張金寶 / 2680人閱讀

摘要:裝飾器介紹中的裝飾器的目的是為一個(gè)目標(biāo)函數(shù)添加額外的功能卻不修改函數(shù)本身。裝飾器的本身其實(shí)是一個(gè)特殊的函數(shù)。那么有啥更好的解決方式呢裝飾器代碼像上面這么寫,可以較好地解決了上面提到的第一個(gè)問題。裝飾器語法糖放在函數(shù)前面,相當(dāng)于執(zhí)行了等。

怎么理解python中的裝飾器 一個(gè)比喻

知乎上有一個(gè)比較形象的比喻 https://www.zhihu.com/questio...:
人類穿著內(nèi)褲很大程度上是為了遮羞和對(duì)關(guān)鍵部位進(jìn)行保護(hù),但是卻不能提供保暖。因此我們還需要穿著長褲。長褲就是對(duì)內(nèi)褲功能的補(bǔ)充,卻不影響內(nèi)褲本身的功能。

裝飾器介紹

python中的裝飾器的目的是為一個(gè)目標(biāo)函數(shù)添加額外的功能卻不修改函數(shù)本身。裝飾器的本身其實(shí)是一個(gè)特殊的函數(shù)。主要的應(yīng)用場景有插入日志,性能測試、事務(wù)處理等。

下面我們來舉一個(gè)簡單的例子一步一步了解一下。

我們首先寫了三個(gè)函數(shù),即對(duì)兩個(gè)數(shù)做加減乘的操作并打?。?/p>

def func_sum(x, y):
    print x+y


def func_minus(x, y):
    print x - y


def func_multiply(x, y):
    print x*y

但是我們現(xiàn)在有了新需求,就是需要在日志中打印所有加、減、乘操作時(shí)的時(shí)間。

import logging
import time


def func_sum(x, y):
    logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
    print x+y


def func_minus(x, y):
    logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
    print x - y


def func_multiply(x, y):
    logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
    print x*y

顯然像上面這樣修改每一個(gè)函數(shù),在每一個(gè)函數(shù)中添加重復(fù)代碼是不合適的。真正理想的是我們可以定義一個(gè)函數(shù),專門用來輸出日志,輸出完日志后,再執(zhí)行真正的函數(shù)。

import logging
import time


def func_sum(x, y):
    print x+y


def func_minus(x, y):
    print x - y


def func_multiply(x, y):
    print x*y


def logging_first(func):
    logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
    return func

logging_first(func_sum)(20,30)

但是上面這中實(shí)現(xiàn)方式也存在著種種問題。

log其實(shí)是logging_first(func_sum)時(shí)就打印了,而不是進(jìn)行加、減、乘的時(shí)候打印的。

對(duì)加減乘函數(shù)的調(diào)用都需要修改成logging_first(func_sum)(20,30)類似方式。
那么有啥更好的解決方式呢?

裝飾器
import logging
import time


def func_sum(x, y):
    print x+y


def func_minus(x, y):
    print x - y


def func_multiply(x, y):
    print x*y


def logging_first(func):
    def wrapper(x, y):
        logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
        return func(x, y)
    return wrapper

logging_first(func_sum)(20, 30)

代碼像上面這么寫,可以較好地解決了上面提到的第一個(gè)問題。調(diào)用logging_first返回的是wrapper函數(shù)。執(zhí)行wrapper函數(shù)的時(shí)候先打印log,然后馬上執(zhí)行了傳入的func函數(shù)。

但是調(diào)用方式依舊需要修改成logging_first(func_sum)(20, 30)這種方式。
幸好,python給我們提供了優(yōu)雅的語法糖。
我們可以將上面的代碼修改成以下形式。

import logging
import time


def logging_first(func):
    def wrapper(x, y):
        logging.warning(time.strftime("%Y-%m-%d %H:%M:%S %Z", time.localtime(time.time())))
        return func(x, y)

    return wrapper


@logging_first
def func_sum(x, y):
    print x + y


@logging_first
def func_minus(x, y):
    print x - y


@logging_first
def func_multiply(x, y):
    print x * y

func_sum(20, 30)
func_minus(20, 30)
func_multiply(20, 30)

裝飾器語法糖放在函數(shù)前面,相當(dāng)于執(zhí)行了logging_firts(func_sum)等。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38250.html

相關(guān)文章

  • Python裝飾學(xué)習(xí)筆記

    摘要:前言最近跟著流暢的和學(xué)習(xí),看到裝飾器部分,有些頭大倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有些地方有些矛盾之處在簡單學(xué)習(xí)和實(shí)踐之后,整理出我對(duì)裝飾器的理解如下裝飾器的定義在不同語境下,裝飾器有不一樣的含義,我大致認(rèn)為有種定義一種把另一個(gè)對(duì) 前言 最近跟著《流暢的Python》和《Python Cookbook》學(xué)習(xí),看到裝飾器部分,有些頭大倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有...

    Cristalven 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記 函數(shù)裝飾

    摘要:實(shí)現(xiàn)一個(gè)簡單的裝飾器輸出被裝飾函數(shù)的運(yùn)行時(shí)間簡單運(yùn)用運(yùn)行結(jié)果運(yùn)行過程中,首先輸出裝飾器函數(shù)中的內(nèi)容被裝飾函數(shù)運(yùn)行時(shí)間長度函數(shù)名稱和實(shí)際參數(shù)計(jì)算結(jié)果然后得到最終的計(jì)算結(jié)果。 函數(shù)裝飾器 函數(shù)裝飾器用于在源碼中標(biāo)記函數(shù), 以某種方式增強(qiáng)函數(shù)的行為,這是一個(gè)強(qiáng)大的功能。 函數(shù)裝飾器是一個(gè)可調(diào)用對(duì)象,其參數(shù)是另外一個(gè)函數(shù),即被裝飾函數(shù)。裝飾器可能處理被裝飾函數(shù),然后將其返回,或者將其替換成另一...

    jsliang 評(píng)論0 收藏0
  • 設(shè)計(jì)模式筆記python實(shí)現(xiàn)

    摘要:設(shè)計(jì)模式學(xué)習(xí)裝飾器模式這個(gè)在我的筆記中有介紹工廠模式未完成,待更新單例模式保證一個(gè)對(duì)象最多只有一個(gè)實(shí)例存在。對(duì)安全性要求較高的場景,比如銀行的修改余額業(yè)務(wù)。如果我們不使用單例模式,那么就會(huì)創(chuàng)建三個(gè)不同的實(shí)例。 設(shè)計(jì)模式學(xué)習(xí) 1.裝飾器模式 這個(gè)在我的筆記中有介紹 2.工廠模式 author : liibntime :2018-11-6未完成,待更新 3.單例模式 保證一個(gè)對(duì)象最多只有一...

    raledong 評(píng)論0 收藏0
  • Python 裝飾的理解

    摘要:的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文,即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作,而函數(shù)本身并沒有任何的改變。中的參數(shù),實(shí)際上則是傳遞給實(shí)際上是的參數(shù)因?yàn)檠b飾器也是個(gè)函數(shù),那么裝飾器自己的能不能有參數(shù)傳遞呢。 Python的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作, 而函數(shù)本身并沒有任何的改...

    animabear 評(píng)論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...

    dailybird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

張金寶

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<