日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11 装饰器

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11 装饰器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾器介紹與簡單實現

1. 什么是裝飾器
器:指的是具備某一功能的工具
裝飾:指的是為被裝飾器對象添加新功能

裝飾器就是用來為被裝飾器對象添加新功能的工具
注意:裝飾器本身可以是任意可調用對象,被裝飾器的對象也可以是任意可調用對象


2. 為何要用裝飾器
開放封閉原則:封閉指的是對修改封閉,對擴展開放

裝飾器的實現必須遵循兩大原則:
1. 不修改被裝飾對象的源代碼
2. 不修改被裝飾器對象的調用方式

裝飾器的目標:就是在遵循1和2原則的前提下為被裝飾對象添加上新功能

3. 怎么用裝飾器
'''
import time

def index():
print('welcome to index page')
time.sleep(3)

def outter(func): # func=最原始那個index的內存地址
def wrapper():
start=time.time()
func() #最原始的那個index的內存地址()
stop=time.time()
print('run time is %s' %(stop - start))
return wrapper

index=outter(index) #index=outter(最原始那個index的內存地址) #index=wrapper的內存地址
index() #wrapper的內存地址()



深入學習 import time

def index():
print('welcome to index page')
time.sleep(3)

def home(name):
print('welcome %s to home page' %name)
time.sleep(2)
return 123

def timmer(func): #func=最原始那個home函數的內地址
def wrapper(*args,**kwargs): #args=('egon',) kwargs={}
start=time.time()
res=func(*args,**kwargs) #最原始那個home函數的內地址('egon')
stop=time.time()
print('run time is %s' %(stop - start))
return res
return wrapper

# index=timmer(index)
index()

home=timmer(home) #home=outter(最原始那個home函數的內地址) #home=wrapper函數的內地址

res=home('egon') # res=wrapper函數的內地址('egon')
print(res) 裝飾器的語法糖 # 裝飾器的語法糖:在被裝飾對象正上方單獨一行寫@裝飾器的名字
# 運行原理:
# python解釋器一旦運行到@裝飾器的名字,就會調用裝飾器,然后將被裝飾函數的內存地址當作參數
#傳給裝飾器,最后將裝飾器調用的結果賦值給原函數名

# import time
#
# def timmer(func): #func=最原始那個home函數的內地址
# def wrapper(*args,**kwargs): #args=('egon',) kwargs={}
# start=time.time()
# res=func(*args,**kwargs) #最原始那個home函數的內地址('egon')
# stop=time.time()
# print('run time is %s' %(stop - start))
# return res
# return wrapper
#
# @timmer #index=timmer(index)
# def index():
# print('welcome to index page')
# time.sleep(3)
#
# @timmer #home=timmer(home)
# def home(name):
# print('welcome %s to home page' %name)
# time.sleep(2)
# return 123
#
# index()
# res=home('egon') # res=wrapper函數的內地址('egon')
# print(res)
#
#



import time

# 裝飾器模板
def outter(func):
def wrapper(*args,**kwargs):
#在調用函數前加功能
res=func(*args,**kwargs) #調用被裝飾的\也就是最原始的那個函數
#在調用函數后加功能
return res
return wrapper

@outter #index=outter(index) #index=wrapper
def index():
print('welcome to index page')
time.sleep(3)

index()


疊加多個裝飾器

'''
import time

def timmer(func): #func=wrapper2
def wrapper1(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #res=wrapper2(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop - start))
return res
return wrapper1

def auth(func): #func=最原始的那個index的內存地址
def wrapper2(*args,**kwargs):
inp_user = input('please input your username: ').strip()
inp_pwd = input('please input your password: ').strip()
if inp_user == 'egon' and inp_pwd == '123':
print('login successfull')
res=func(*args,**kwargs) # 調用最原始的那個/也就是被裝飾的那個函數
return res
else:
print('username or password error')
return wrapper2

# 解釋@語法的時候是自下而上運行
# 而執行裝飾器內的那個wrapper函數時的是自上而下
@timmer # index=timmer(wrapper2) #index=wrapper1
@auth # index=auth(最原始的那個index的內存地址) #index=wrapper2
def index():
print('welcome to index page')
time.sleep(3)

index() #wrapper1()

'''



# import time
#
# def timmer(func):
# print('timmer')
# def wrapper1(*args,**kwargs):
# start=time.time()
# res=func(*args,**kwargs) #res=wrapper2(*args,**kwargs)
# stop=time.time()
# print('run time is %s' %(stop - start))
# return res
# return wrapper1
#
# def auth(func):
# print('auth')
# def wrapper2(*args,**kwargs):
# inp_user = input('please input your username: ').strip()
# inp_pwd = input('please input your password: ').strip()
# if inp_user == 'egon' and inp_pwd == '123':
# print('login successfull')
# res=func(*args,**kwargs) # 調用最原始的那個/也就是被裝飾的那個函數
# return res
# else:
# print('username or password error')
# return wrapper2
#
#
# @auth # index=auth(wrapper1) #index=wrapper2
# @timmer #timmer(最原始的index)返回wrapper1
# def index():
# print('welcome to index page')
# time.sleep(3)
#
# index() #wrapper2()
#




import time



def outter1(func1): #func1=wrapper2
print('outter1')
def wrapper1(*args,**kwargs):
print('wrapper1')
res1=func1(*args,**kwargs) #res1=wrapper2(*args,**kwargs)
return res1
return wrapper1

def outter2(func2): #func2=最原始的那個index的內存地址
print('outter2')
def wrapper2(*args,**kwargs):
print('wrapper2')
res2=func2(*args,**kwargs)
return res2
return wrapper2


@outter1 # index=outter1(wrapper2) #index=wrapper1
@outter2 #outter2(最原始的那個index的內存地址) ===> wrapper2
def index():
print('welcome to index page')
time.sleep(3)

index() #wrapper1()

'''
outter2
outter1
wrapper1
wrapper2

'''
有參裝飾器 import time

current_user={'username':None}

# 補充:所有的數據類型的值自帶布爾值,可以直接當作條件去用,只需要記住布爾值為假的那一些值即可(0,空,None)


def login(engine='file'): #engine='mysql'
def auth(func): #func=最原始那個index的內存地址
def wrapper(*args,**kwargs):
if current_user['username']:
print('已經登錄過了,無需再次登陸')
res=func(*args,**kwargs)
return res

if engine == 'file':
inp_user = input('please input your username: ').strip()
inp_pwd = input('please input your password: ').strip()
if inp_user == 'egon' and inp_pwd == '123':
print('login successfull')
current_user['username']=inp_user # 在登陸成功之后立刻記錄登錄狀態
res=func(*args,**kwargs) # res=最原始那個index的內存地址(*args,**kwargs)
return res
else:
print('username or password error')
elif engine == 'mysql':
print('基于mysql的認證機制')
elif engine == 'ldap':
print('基于ldap的認證機制')
else:
print('無法識別的認證源')
return wrapper
return auth

@login('file') #@auth # index=auth(最原始那個index的內存地址) #index=wrapper
def index():
print('welcome to index page')
time.sleep(3)

@login('file')
def home(name):
print('welcome %s to home page' %name)
time.sleep(2)
return 123


index() #wrapper()
res=home('egon')
print(res)



# 有參裝飾器的模板
def outter1(x,y,z):
def outter2(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
return outter2

# 無參裝飾器的模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper

轉載于:https://www.cnblogs.com/ouyang99-/p/10414876.html

總結

以上是生活随笔為你收集整理的11 装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。