装饰器

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__()

 

posted @ 2018-07-14 19:25  fight139  阅读(156)  评论(0编辑  收藏  举报