裝飾器(decorators)

裝飾器讓你在?個函數(shù)的前后去執(zhí)?代碼达布。

封裝?個函數(shù), 并且?這樣或者那樣的?式來修改它的?為虾标,這就是裝飾器所做的事情蔓腐。

列如:

from functools import wraps

def a_new_decorator(a_func):

? ? @wraps(a_func)

????def wrapTheFunction():

? ? ? ? print("I am doing somethings before executing a_func")

? ? ? ? a_func()

? ? ? ? print("I am doing somethings after executing?a_func")

? ? retun wrapTheFunction

@a_new_decorator

def a_function():
? ? print("I am the function")

a_function()

print(a_function.__name__)? #可以試著去掉@wraps再執(zhí)行看看

注意: @wraps接受?個函數(shù)來進?裝飾, 并加?了復制函數(shù)名稱刁品、 注釋?檔泣特、 參數(shù)列表等等的功能。 這可以讓我們在裝飾器??訪問在裝飾之前的函數(shù)的屬性挑随。

1状您、裝飾器在Flask和Django等web框架和日志中使用比較頻繁,舉個日志的例子

from functools import wraps

def logit(func):

? ? @wraps(func)

? ? def with_logging(*args,**kwargs):

? ? ? ? print(func.__name__ + " was called")

? ? ? ? return func(*args,**kwargs)

? ? return with_logging

@logit

def addition_func(x):

? ? return (x+x)

result = addition_func(4)

2兜挨、在函數(shù)中嵌入裝飾器膏孟,構建帶參數(shù)的裝飾器

from functools import wraps

def logit(logfile="out.log")

? ? def logging_decorator(func):

? ? ? ? @wraps

? ? ? ? def wrapped_function(*args,**kwargs):

? ? ? ? ? ? log_string = func.__name__ + "was called"

? ? ? ? ? ? print(log_string)

? ? ? ? ? ? with open(logfile,'a') as opened_file:

? ? ? ? ? ? ? ? opened_file.write(log_string + '\n')

? ? ? ? return wrapped_function

? ? return logging_decorator

@logit()

def func1():

? ? pass

執(zhí)行func1,會生成out.log的日志文件

@logit(logfile="func2.log")

def func2():

? ? pass

執(zhí)行func2拌汇,會生成func2.log的日志文件

3柒桑、裝飾器類

class logit(object):

? ? def __init__(self,logfile="out.log"):

? ? ? ? self.logfile = logfile

? ? def __call__(self,func):

? ??????log_string =?func.__name__ + "was called"

? ? ? ? print(log_string)

? ? ? ? with open(self.logfile,'a') as opened_file:

? ? ? ? ? ? opened_file.write(log_string + "\n")

? ? ? ? #寫完日志后發(fā)送通知

????????self.notify()

? ? def notify(self):

? ? ? ? pass

@logit

def func1():

? ? pass

接著給logit創(chuàng)建子類來實現(xiàn),發(fā)送郵件通知的功能

import smtplib

from email.mime.text import MIMEText

from email.header import Header

class email_logit(logit):

? ? def __init__(self, email = "recv@163.com", *args, **kwargs):

? ? ? ? self.recv_email = email

? ? ? ? super(logit, self).__init__(*args, **kwargs)

? ? def notify(self):

? ??????smpt_host = "smtp.163.com"

? ? ? ? send_email = "sender@163.com"

? ? ? ? pwd = "123456"

? ? ? ? smtp = smtplib.SMTP()

? ? ? ? smtp.connect(smpt_host)

? ? ? ? smtp.login(send_email, pwd)

? ? ? ? message =?MIMEText("logfile is done", 'plain', 'utf-8')

? ? ? ? message["From"] = Header("發(fā)件人", 'uft-8')

? ? ? ? message["To"] = Header("收件人",?'uft-8')

? ? ? ? message["Subject"] = Header("郵件測試",?'uft-8')

? ? ? ? smtp.sendmail(send_email, self.recv_email, message.as_string())

? ? ? ? smtp.quit()

從現(xiàn)在起噪舀, @email_logit將會和@logit產(chǎn)生同樣的效果魁淳, 但是在打?志的基礎上飘诗, 還會多發(fā)送?封郵件給管理員。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末界逛,一起剝皮案震驚了整個濱河市昆稿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌息拜,老刑警劉巖溉潭,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異少欺,居然都是意外死亡岛抄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門狈茉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掸掸,你說我怎么就攤上這事氯庆。” “怎么了扰付?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵堤撵,是天一觀的道長。 經(jīng)常有香客問我羽莺,道長实昨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任盐固,我火速辦了婚禮荒给,結果婚禮上,老公的妹妹穿的比我還像新娘刁卜。我一直安慰自己志电,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布蛔趴。 她就那樣靜靜地躺著挑辆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孝情。 梳的紋絲不亂的頭發(fā)上鱼蝉,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音箫荡,去河邊找鬼魁亦。 笑死,一個胖子當著我的面吹牛菲茬,可吹牛的內(nèi)容都是我干的吉挣。 我是一名探鬼主播派撕,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睬魂!你這毒婦竟也來了终吼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氯哮,失蹤者是張志新(化名)和其女友劉穎际跪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喉钢,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡姆打,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肠虽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔戏。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖税课,靈堂內(nèi)的尸體忽然破棺而出闲延,到底是詐尸還是另有隱情,我是刑警寧澤韩玩,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布垒玲,位于F島的核電站,受9級特大地震影響找颓,放射性物質發(fā)生泄漏合愈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一击狮、第九天 我趴在偏房一處隱蔽的房頂上張望佛析。 院中可真熱鬧,春花似錦帘不、人聲如沸说莫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽储狭。三九已至,卻和暖如春捣郊,著一層夾襖步出監(jiān)牢的瞬間辽狈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工呛牲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刮萌,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓娘扩,卻偏偏與公主長得像着茸,于是被迫代替她去往敵國和親壮锻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容