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

开放封闭原则
开放:对扩展是开放的
封闭:对修改是封闭的
装饰器是开放封闭原则的完美演绎

练习题

#用装饰器实现,访问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()
View Code
# 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()
View Code

 

 
 
 
posted @ 2017-11-02 16:33  dwenwen  阅读(242)  评论(0编辑  收藏  举报