装饰器
可调用对像like函数。
本质是函数,被装饰的对像也是函数。修改对像的方法,并且,不改变被装饰函数的代码。
无参装饰器
#为什么要用装饰器及开放封闭原则 #什么是装饰器 # import time # def timmer(func): # def wrapper(*args,**kwargs): # start=time.time() # res=func(*args,**kwargs) # stop=time.time() # print('run time is %s ' %(stop-start)) # return wrapper # # # @timmer # def index(): # time.sleep(3) # print('welcome to oldboy') # # index() #装饰器 # import time # # @home #home=名字(home) # def home(): # time.sleep(3) # print('welcome to oldboy') # # index() # def get(url): # def index(): # return urlopen(url).read() # return index import time def timmer(func): #func=home函数地址,python的变量没有储值功能,只是绑定关系 def wrapper(): # print(func) start_time=time.time() func() stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return wrapper @timmer # index=timmer(index)只要见到装饰器就会有这嘛个操作过程 def index(): time.sleep(3) print('welcome to oldboy') @timmer def home(name): time.sleep(2) print('welcome to %s home page' %name) # def my_max(x,y): # print('from my_max func') # return x+y # index() #--=--->wrapper() home('dragon')
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() func(*args,**kwargs) #home(name) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return wrapper @timmer #home=timmer(home) def home(name): time.sleep(2) print('welcome to %s home page' %name) @timmer #auth=timmer(auth) def auth(name,password): print(name,password) @timmer def tell(): print('-=----------')
代码执行到def只要没有函数的调用()函数体里的东西都不执行,所以执行home()这个函数就相当于执行home=timmer(home),而timmer(home)的结果是返回值wapper home('dragon') #wrapper('dragon') auth('egon','123') #wrapper('egon','123') tell()
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) #my_max(1,2) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer#一看到装饰器就要注意,下面的函数就不要看了,就变成my_max=timmer(my_max)=wrapper,所 以my_max要返回值,给wrapper也一样的加上就可以 def my_max(x,y): print('my_max function') res=x if x > y else y return res #带返回值的装饰器的写法注意了 res=my_max(1,2) #res=wrapper(1,2) print('=====>',res)
#####################################################################################################################
有参装饰器
对如下代码进行的解释,对装饰器进行传入参数,其实就是在原来装饰器的基础上,进行闭包的处理,(外面再加个函数,并返回auth),这样,你传进去的
变量 auth_type就可以在auth这个函数里用了,就可以加判断了
def auth2(auth_type): def auth(func): # print(auth_type) def wrapper(*args,**kwargs): if auth_type == 'file': name=input('username: ') password=input('password: ') if name == 'zhejiangF4' and password == 'sb945': print('auth successfull') res=func(*args,**kwargs) return res else: print('auth error') elif auth_type == 'sql': print('还他妈不会玩') return wrapper return auth @auth2(auth_type='sql') #@auth #index=auth(index) def index(): print('welcome to inex page') # @auth # def home(): # print('welcome to home page') index()
有参函数执行过程
def auth2(auth_type): #1 #3 def auth(func): #4 #6 def wrapper(*args,**kwargs): #7 #10 if auth_type == 'file': #11 name=input('username: ') password=input('password: ') if name == 'zhejiangF4' and password == 'sb945': print('auth successfull') res=func(*args,**kwargs) return res else: print('auth error') elif auth_type == 'sql': #12 print('还他妈不会玩') #13 return wrapper #8 return auth #5 @auth2(auth_type='sql') #2 index=auth(auth_type='sql') def index(): print('welcome to inex page') # @auth # def home(): # print('welcome to home page') index() #9
# @aaa # def func(): # pass # # # func=aaa(func) #说明,同时加上多个装饰器的,从函数头上开始,由下往上,一个个的加 # @ccc # @bbb # @aaa # def func(): # pass # # func=ccc(bbb(aaa(func))) # # @ccc('c') # @bbb('b') # @aaa('a') # def func(): # pass # # func=ccc('c')(bbb('b')(aaa('a')(func)))
# current_login={'name':None,'login':False} # # with open('user.db','w') as f: # f.write(str(current_login)) # with open('user.db','r') as f: x=f.read() print(x,type(x)) print(eval(x)['name']) #eval函数说明 evel会把字符串里面的语句,拿来重新执行一下 比如x="{"name":"wan"}" eval(x) = {"name":"wan"}