装饰器
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
# 最简单的装饰器:
# 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