python全栈开发总结_python全栈开发 * 12 知识点汇总 * 180530
?. 通?裝飾器的回顧
1.開閉原則: 對增加功能開放. 對修改代碼封閉
2.裝飾器的作?: 在不改變原有代碼的基礎上給?個函數增加功能
3.通?裝飾器的寫法:
def wrapper(fn):
def inner(*args,**kwargs):
print("目標函數前一行")
ret=fn(*args,**kwargs)
print("目標函數后一行")
return ret
return inner
@wrapper
def target_func(*args,**kwargs):
print("我是目標函數體")
target_func()
4.執?過程:
(1) 程序從上向下, 當執?到@wrapper的時候. 把函數作為參數傳遞給wrapper函數. 得到inner函數. 重新賦值給target_func
(2) 當執?到target_func的時候. 我們實際上執?的是inner函數. inner函數會先執??標函數之前的代碼. 然后再執?你的?標函數. 執?完?標函數最后執?的是?標函數
之后的代碼
?. 函數的有?信息
1. 如何給函數添加注釋 用三個引號來表示
def eat(food,drink):
""" eat:把傳遞進來的吃掉
:param food: 參數food是什么意思
:param drink: 參數drink是什么意思
:return: None 返回什么
"""
print(food,drink)
return "very good"
按住ctrl 點內置函數名,可以查看函數的注釋如int,str 等
2.如何獲取到函數的相關信息
def eat(food,drink):
"""
:param food: 參數food是什么意思
:param drink: 參數drink是什么意思
:return: None 返回什么
"""
print(food,drink)
# print(eat.__name__) 讀取不出來
# print(eat.__doc__) 讀取不出來
return "very good"
eat("水果","可樂")
print(eat.__name__) # 查詢函數名
print(eat.__doc__) #查詢函數文檔注釋
函數名.__name__可以查看函數的名字 (雙下劃線)
函數名.__doc__ 可以查看函數的?檔注釋
(1) 一個被裝飾器裝飾過的函數:查詢目標函數的函數名
def wrapper(fn):
def inner(*args,**kwargs): # 聚合
print("目標函數前一行")
ret=fn(*args,**kwargs) # 打散 這?的作?. 其實就是為了保證我可以裝飾所有函數?準備的
print("目標函數后一行")
return ret
return inner
@wrapper
def target_func(*args,**kwargs):
print("我是目標函數體")
target_func()
print(target_func.__name__) # 被裝飾過的函數函數名是inner.
(2) 把上述查詢函數名修改為原函數名
from functools import wraps # 加 引入函數模塊
def wrapper(fn):
@wraps(fn) # 加 使用函數原來的名字
def inner(*args,**kwargs):
print("目標函數前一行")
ret=fn(*args,**kwargs)
print("目標函數后一行")
return ret
return inner
@wrapper
def target_func(*args,**kwargs):
print("我是目標函數體")
target_func()
print(target_func.__name__) # 查詢結果不再是inner 而是target_func
@wrapper
def new_target_func():
print("我是另?個?標函數")
new_target_func()
print(new_target_func.__name__)
三.裝飾器傳參
def wrapper_out(flag):
def wrapper(fn):
def inner(*args,**kwargs):
if flag==True: # 設定條件,滿足執行下一步
print("目標函數前一行")
ret=fn(*args,**kwargs)
print("目標函數后一行")
else: # 不滿足執行這一步
ret=fn(*args,**kwargs)
return ret
return inner
return wrapper
@wrapper_out(True)
def target_func():
print("我是目標函數體")
target_func() # 目標函數前一行,我是目標函數體,目標函數后一行
@wrapper_out(False)
def target_func():
print("我是目標函數體")
target_func() # 我是目標函數體
執行步驟: 先執?wrapper(True) 然后再@返回值. 返回值恰好是wrapper. 結果就是@wrapper
四.多個裝飾器裝飾一個函數
def wrapper(fn):
def inner(*args,**kwargs):
print("我是a")
ret=fn(*args,**kwargs)
print("我是b")
return ret
return inner
def wrapper1(fn):
def inner(*args,**kwargs):
print("我是c")
ret=fn(*args,**kwargs)
print("我是d")
return ret
return inner
def wrapper2(fn):
def inner(*args,**kwargs):
print("我是e")
ret=fn(*args,**kwargs)
print("我是f")
return ret
return inner
@wrapper2
@wrapper1
@wrapper
def eat(*args,**kwargs):
print("我是目標函數")
eat()
執行步驟:
執?順序:
?先@wrapper1裝飾起來. 然后獲取到?個新函數是wrapper1中的inner.
然后執?@wrapper2.這個時候. wrapper2裝飾的就是wrapper1中的inner.
第?層裝飾器前(第?層裝飾器前(?標)第?層裝飾器后)第?層裝飾器后. 程序從左到右執?
五.補充知識點
總結
以上是生活随笔為你收集整理的python全栈开发总结_python全栈开发 * 12 知识点汇总 * 180530的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python赚零花钱_用Python拓
- 下一篇: 使用opengl编程实现一个三维渲染实体