Title

一、装饰器含义

  装饰器本质就是函数,为其它函数添加附加功能

二、装饰器原则

  1.不修改被修饰函数的代码

  2.不修改被修饰函数的调用方式

三、装饰器知识

  装饰器 = 高阶函数 + 函数嵌套 + 闭包

四、装饰器介绍

  1.装饰器基本框架
def timer(func):    #func为被修饰函数
    def wrapper():   #函数嵌套
        func()      #执行func函数
    return wrapper
  2、基本装饰器(基本框架+参数+功能+返回值+使用装饰器+语法糖@)
import time

def timmer(func): #func=test
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
    return wrapper

@timmer #test=timmer(test)  timmer执行后会返回wrapper地址赋值给test
def test():
    time.sleep(3)
    print('test函数运行完毕')

test()
  3.加上返回值的装饰器
import time

def timmer(func): #func=test
    def wrapper():
        # print(func)
        start_time=time.time()
        res = func() #就是在运行test()
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper

@timmer #test=timmer(test)  timmer执行后会返回wrapper地址赋值给test
def test():
    time.sleep(3)
    print('test函数运行完毕')
    return '这是test的返回值'

res2 = test()
print (res2)

输出:
test函数运行完毕
运行时间是3.0001718997955322
这是test的返回值
  4.加上参数的装饰器
import time
def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()    func(*('linhaifeng'),**{'age':18})
        stop_time = time.time()
        print('运行时间是%s' %(stop_time-start_time))
        return res
    return wrapper

# @timmer #test=timmer(test)
def test(name,age):
    time.sleep(3)
    print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
    return '这是test的返回值'

@timmer
def test1(name,age,gender):
    time.sleep(1)
    print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
    return '这是test的返回值'

# res=test('linhaifeng',age=18)  #就是在运行wrapper
# # print(res)
# test1('alex',18,'male')

test1('alex',18,'male')
  5.带参数的装饰器
 1 user_list=[
 2     {'name':'alex','passwd':'123'},
 3     {'name':'linhaifeng','passwd':'123'},
 4     {'name':'wupeiqi','passwd':'123'},
 5     {'name':'yuanhao','passwd':'123'},
 6 ]
 7 current_dic={'username':None,'login':False}
 8 
 9 def auth(auth_type='filedb'):
10     def auth_func(func):
11         def wrapper(*args,**kwargs):
12             print('认证类型是',auth_type)
13             if auth_type == 'filedb':
14                 if current_dic['username'] and current_dic['login']:
15                     res = func(*args, **kwargs)
16                     return res
17                 username=input('用户名:').strip()
18                 passwd=input('密码:').strip()
19                 for user_dic in user_list:
20                     if username == user_dic['name'] and passwd == user_dic['passwd']:
21                         current_dic['username']=username
22                         current_dic['login']=True
23                         res = func(*args, **kwargs)
24                         return res
25                 else:
26                     print('用户名或者密码错误')
27             elif auth_type == 'ldap':
28                 print('鬼才特么会玩')
29                 res = func(*args, **kwargs)
30                 return res
31             else:
32                 print('鬼才知道你用的什么认证方式')
33                 res = func(*args, **kwargs)
34                 return res
35 
36         return wrapper
37     return auth_func
38 
39 @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
40 def index():
41     print('欢迎来到京东主页')
42 
43 @auth(auth_type='ldap')
44 def home(name):
45     print('欢迎回家%s' %name)
46 #
47 @auth(auth_type='sssssss')
48 def shopping_car(name):
49     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
50 
51 # print('before-->',current_dic)
52 # index()
53 # print('after--->',current_dic)
54 # home('产品经理')
55 shopping_car('产品经理')
def auth(n):
    def myfunc(func):
        def wrapper(*args,**kwargs):
            if n=='1':
                return func(*args,**kwargs)
            else:
                print('can shu bu cun zai')
        return wrapper
    return myfunc
@auth('1')
def index():
    print('欢迎来到京东主页')

index()
支持参数的装饰器
原文地址:https://www.cnblogs.com/guotianbao/p/6809645.html