裝飾器本質上是乙個python函式,其返回值也是乙個函式物件
作用:不修改原函式情況下,為已有函式新增新的功能。如插入日誌、效能測試、事務處理、快取、許可權校驗等場景。
閉包函式
在函式內部定義乙個內嵌函式,內嵌函式引用了外部函式的變數,此時內嵌函式稱為閉包函式。閉包函式所引用的外部定義的變數被叫做自由變數。閉包可以將其自己的**和作用域以及外部函式的作用結合在一起。
# coding=utf-8
def printer(number):
def number_printer():
print(number)
return number_printer
if __name__ == '__main__':
printer(4)
閉包和面向介面程式設計的概念很像,可以把閉包理解成輕量級的介面封裝。
# coding=utf-8
def tag(content):
def add_tag(tag_name):
return "<>".format(tag_name, content)
return add_tag
if __name__ == '__main__':
add_tag = tag('hello')
print(add_tag('a')) # 輸出:hello
print(add_tag('b')) # 輸出:hello
函式裝飾器
# coding=utf-8
def debug(func):
print("[debug]: enter {}()".format(func.__name__))
return func(*args, **kwargs)
@debug
def say_hi(name):
print("hi {}!".format(name))
if __name__ == '__main__':
say_hi('lucy')
# 輸出:
# [debug]: enter say_hi()
# hi lucy!
類裝飾器
即定義乙個類作為裝飾器。具體做法是過載類中的__call__
函式,使其返回乙個函式。
# coding=utf-8
class decorator(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("[debug]: enter {}()".format(self.func.__name__))
return self.func(*args, **kwargs)
@decorator
def say_hi(name):
print("hi {}!".format(name))
if __name__ == '__main__':
say_hi('lucy')
# 輸出:
# [debug]: enter say_hi()
# hi lucy!
如果需要給類裝飾器傳引數,則需要在建構函式中傳入並儲存引數,過載__call__
方法,接收乙個函式作為引數,定義裝飾函式,並返回裝飾函式。
# coding=utf-8
class decorator(object):
def __init__(self, level):
self.level = level
def __call__(self, func):
print("[debug:{}]: enter {}()".format(
self.level,
func.__name__)
)return func(*args, **kwargs)
@decorator('info')
def say_hi(name):
print("hi {}!".format(name))
if __name__ == '__main__':
say_hi('lucy')
# 輸出:
# [debug:info]: enter say_hi()
# hi lucy!
python學習筆記之裝飾器
def print msg print msg是外函式 msg i m 狂師 defprinter printer是巢狀函式 print msg return printer 返回巢狀函式printerdef func a,b def line n nonlocal a nonlocal用於宣告變數...
Python之裝飾器筆記
概述 用於管理和增強函式和類行為的 提供一種在函式或類定義中插入自動執行 的機制 特點 更明確的語法 更高的 可維護性 更好的一致性 編寫函式基礎 將函式賦給變數 將函式作為引數傳遞 函式巢狀及跨域訪問 函式定義裝飾器 通用性更好 1 函式定義裝飾器 2 通用性更好34 引數化裝飾器 5def ta...
Python 學習筆記 裝飾器
裝飾器也是乙個函式 巢狀 用來裝飾某個函式,來看下面的 import time deftime count func def start time.time func end time.time print this funnction costs end start deftellhi print...