首页 > 代码库 > 021day--python装饰器

021day--python装饰器

一、装饰器含义

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

 

二、装饰器原则

  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(产品经理)

 

  

 

021day--python装饰器