python - 装饰器(重点,难点(比较绕))
装饰器
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
# 最简单的装饰器: # def timemer(qqxing): #timmer是装饰器的名字,传入的参数就是被装饰的函数 # def inner(): #在装饰器中需要定义一个内部函数 # qqxing() #被装饰的函数,并且要执行 # return inner #将内部函数的名字返回 # # def func(): # print('我是好人') # # func = timemer(func) # func()
# 装饰器中对被装饰的函数功能的扩展 # def timmer(qqxing): # def inner(): # print('调用func之前') # qqxing() # print('调用func之后') # return inner # # @timmer #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func) # def func(): # print('我是好人') # # func()
# def timmer(qqxing): # def inner(name): # print('调用func之前') # qqxing(name) # print('调用func之后') # return inner # # @timmer #语法糖,语法糖是紧贴着被装饰的函数:语法糖相当于func = timmer(func) # def func(name): # print('%s是好人'%name) # # @timmer # def func1(name): # print('%s是好人'%name) # # func('文文')
# # 完整的装饰--万能的装饰 # def timmer(qqxing): # def inner(*args,**kwargs): # qqxing(*args,**kwargs) # return inner # # @timmer # def func(name): # print('%s是好人'%name) # # @timmer # def func1(a): # print('func2: %s'%(a)) # # func('tom') # func1(a=3)
装饰器的固定结构:
def wrapper(func):
def inner(*args,**kwargs):
'''被装饰函数执行之前要添加的代码'''
ret = func(*args,**kwargs)
'''被装饰函数执行之后要添加的代码'''
return ret
return inner
开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
装饰器是开放封闭原则的完美演绎
练习题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#用装饰器实现,访问art或者dar函数,登陆一次之后,无需再次登录 # flag = False # def login(func): # def inner(*args,**kwargs): # global flag # if flag == False: # username = input('用户名:') # password = input('密码:') # if username == 'alex' and password == 'somebody': # print('登录成功') # flag = True # if flag == True: # ret = func(*args,**kwargs) # return ret # return inner # # @login # def art(): # print('欢迎来到文章页') # # @login # def dar(): # print('欢迎来到日记页') # # art() # dar()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# def log(func): # def inner(*args,**kwargs): # print('你要调用%s函数了'%func.__name__) # ret = func(*args,**kwargs) # return ret # return inner # # @log # def f1(): # print('f1') # @log # def f2(): # print('f2') # # f1() # f2()