python-day14--带参数的装饰器+多个装饰器装饰同一个函数

1.# 带参数的装饰器
def f1(flag):
def f2(func):
def inner(*args,**kwargs):
if flag:
'''执行函数之前要做的'''
r=func(*args,**kwargs)
if flag:
'''执行函数之后要做的'''
return r
return inner
return f2
@f1(True)
def f3():
print('egon')
return ('eva')
s=f3()
print(s)

2.#有参装饰器
def auth(auth_type): #auth_type='mysql'
def auth2(func):
def inner(*args,**kwargs):
if auth_type == 'file':
name=input('name:>> ')
pwd=input('password:>> ')
if name == 'egon' and pwd == '123':
res=func(*args,**kwargs)
return res
else:
print('auth error')
elif auth_type == 'mysql':
print('mysql auth')
else:
print('not valid auth source')
return inner
return auth2

@auth(auth_type='mysql') #@auth2 #index=auth2(最原始的index) #index=inner
def index(name):
print('welcome %s to index' %name)

index('egon') #inner('egon')


2.#多个装饰器装饰一个函数
def qqxing(func):
def qqxing_inner(*args,**kwargs):
print('in qqxing:before')
ret = func(*args,**kwargs)
print('in qqxing:after')
return ret
return qqxing_inner

def pipixia(func):
def pipixia_inner(*args,**kwargs):
print('in pipixia:before')
ret = func(*args,**kwargs)
print('in pipixia:after')
return ret
return pipixia_inner


@qqxing
@pipixia
def dapangxie():
print("饿了么")
dapangxie()



#应用场景

#func
#1.计算func的执行时间 @timmer
#1.登录认证 #@auth

#@auth #先登录 在认证
#@timmer
#func

#解耦 尽量的让代码分离。小功能之间的分离
#解耦的目的 提高代码的重用性
posted @ 2017-07-28 18:22  Cool·  阅读(359)  评论(0编辑  收藏  举报