装饰器
1.定义
本质上是函数,用来装饰其他函数,给函数添加新的功能
常用的形式:setter、getter
@property def password(self): return self._password @password.setter def password(self, pwd): self._password = werkzeug.security.generate_password_hash(pwd) # _password存入的是密文
2.原则
- 不改变原来的函数代码
- 不改变原来函数的调用方式
3.定义装饰器
def timmer(func): def wrapper(*args, **kwargs): start_time = time.time() func(args[0]) end_time = time.time() print('fun1 run time is %s' %(end_time - start_time)) return wrapper @timmer # 等价于:fun1 = timmer(fun1), 此时fun1先指向函数1,然后指向新的函数wrapper def fun1(a): time.sleep(3, a) print('fun1...') if __name__ == '__main__': fun1(10) # 装饰器的实现原理: fun1 = timmer(fun1); fun1(10)
本质上将函数指向新的函数地址。
4.高阶函数
- 把一个函数名当做实参传递给一个函数
- 返回值中包含函数名
5.嵌套函数-函数即变量
6.参数,返回值
嵌套函数的参数就是源函数的参数。
def timmer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print('fun1 run time is %s' %(end_time - start_time))
return result return wrapper @timmer # 等价于:fun1 = timmer(fun1), 此时fun1先指向函数1,然后指向新的函数wrapper def fun1(a): time.sleep(3, a) print('fun1...') if __name__ == '__main__': fun1(10) # 装饰器的实现原理: fun1 = timmer(fun1); fun1(10)
7.装饰器的参数
@timmer(param = '')
import time def wrapper(options)
def inner(func, *args, **kargs):
pass
return inner
# 有括号,就立刻执行wrapper函数,所以@wrapper({}) 等价于@inner # inner = wrapper({}) ==> @inner
# index = inner @wrapper({'key':'value'})
def index(a,*b): print('fun1...', a, b) if __name__ == '__main__': fun1(10, 20, 20)
8. ContentManager装饰器
借助这个装饰器,可以省略__enter__() __exit__()