Python之裝飾器學習筆記

2021-09-27 02:00:43 字數 2370 閱讀 3289

裝飾器本質上是乙個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...