Python笔记-函数装饰器
生活随笔
收集整理的這篇文章主要介紹了
Python笔记-函数装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在調用某個方法前,想調用一些額外的東西。
個人感覺就和C++里面,帶一個函數指針的的參數,在某個函數執行前,調用這個函數指針,或者,在某個函數中,直接調用這個函數。比如插入日志等。功能。
?
但在python可以使用@標識符,進行函數裝飾器
這個和java反射有異曲同工之妙(應該說注解,但注解的本質就是反射)
如下python
def bar1():print("[debug] bar1 is running")print("i am bar1")def bar2():print("[debug] bar2 is running")print("i am bar2")if __name__ == "__main__":bar1()bar2()程序運行截圖如下:
開始用了,最原始的方式
def use_logging(func_name):#print("[debug]" + func_name + "is running")print("[debug] %s is running" % func_name)def bar1():use_logging("bar1")print("i am bar1")def bar2():use_logging("bar2")print("i am bar2")if __name__ == "__main__":bar1()bar2() 這里就是在函數里面調用其他函數, 下面是使用古老裝飾器模式方式:使用裝飾器,這個是古老的方式,用C/C++來理解就是func是一個函數指針,use_logging函數把func的名字打印后,把指針返回來,然后給bar1,bar1再調用,即可
def use_logging(func):def wrapper(*args, **kwargs):print("[debug] %s is running" % func.__name__)return func(*args, **kwargs)return wrapperdef bar1():print("i am bar1")def bar2():print("i am bar2")if __name__ == "__main__":bar11 = use_logging(bar1)bar11()bar22 = use_logging(bar2)bar22()程序運行截圖如下:
下面是新時代寫法,和Java注解差不多,從這里可以看到Java和Python寫代碼,的確比C/C++爽。
def use_logging(func):def wrapper(*args, **kwargs):print("[debug] %s is running" % func.__name__)return func(*args, **kwargs)return wrapper@use_logging def bar1():print("i am bar1")@use_logging def bar2():print("i am bar2")if __name__ == "__main__":bar1()bar2()程序運行截圖如下:
下面是帶參數的函數裝飾器
def use_logging(level = "debug"):def decorator(func):def wrapper(*args, **kwargs):print("[%s] %s is running" % (level, func.__name__))return func(*args, **kwargs)return wrapperreturn decorator@use_logging() def bar1():print("i am bar1")@use_logging(level = "error") def bar2():print("i am bar2")if __name__ == "__main__":bar1()bar2()程序運行截圖如下:
?
總結
以上是生活随笔為你收集整理的Python笔记-函数装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql笔记-对left join使用
- 下一篇: Qt笔记-QWebView完整加载页面及