无参装饰器以及装饰器语法糖

1. 什么是装饰器
装饰器指的是为被装饰对象添加新功能的工具
装饰器本身可以是任意可调用对象
被装饰对象本身也可以是任意可调用对象


2. 为何要用装饰器
开放封闭原则:对修改封闭,对扩展开发

装饰器的实现原则:
1. 不能修改被装饰对象的源代码
2. 不能修改被装饰对象的调用方式

装饰器的目的:
就是在遵循原则1和2的前提为被装饰对象添加新功能

3. 如何用
# part1
import time

def index():
time.sleep(1)
print('welcome to index page')

def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop -start))

wrapper()


part2
import time

def outter(func):
# func=最原始那个index的内存地址
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #最原始那个index的内存地址()
stop=time.time()
print('run time is %s' %(stop -start))
return res
return wrapper

@outter #index=outter(index) #inex=outter(最原始那个index的内存地址) # index=wrapper的内存地址
def index():
time.sleep(1)
print('welcome to index page')
return 1234

@outter #home=outter(home)    @加上装饰器变量名就是语法糖,如 @outter
def home(name):
time.sleep(1)
print('welcome %s to home page' %name)


res=index() #wrapper的内存地址()
# print('返回值',res)

home('egon')


小练习
import time

def auth(func):
# func=index
def wrapper(*args,**kwargs):
name=input('name>>>: ').strip()
pwd=input('pwd>>>: ').strip()
if name == 'egon' and pwd == '123':
print('login successfull')
res=func(*args,**kwargs)
return res
else:
print('user or pwd error')
return wrapper


@auth
def index():
time.sleep(1)
print('welcome to index page')
return 1234

index()

无参装饰器模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper