zoukankan      html  css  js  c++  java
  • Python笔记4(装饰器进阶)

    进阶的需求

    1、第一种情况

    需要给500个函数添加装饰器,如果你逐个添加或者取消添加会非常麻烦,并且浪费成本;
    现在,你可以设计你的装饰器 来确认是否生效。

     1 import time
     2 FLAG = True#全局变量
     3 def outer(flag):
     4     def timmer(f):
     5         def inner(*args,**kwargs):
     6             if flag == True:#如果flag为True,原有的函数前后增加功能,且不改变原函数的调用方式
     7                 start_time = time.time()
     8                 ret = f(*args,**kwargs)
     9                 end_time = time.time()
    10                 print(end_time - start_time)
    11             else:#如果flag不为True,只执行原有的函数,且不改变原函数的调用方式
    12                 ret = f(*args, **kwargs)
    13             return ret
    14         return inner
    15     return timmer
    16 
    17 @outer(FLAG)   # func = timmer(func)
    18 def func(a,b):
    19     print('begin func',a)
    20     time.sleep(0.1)
    21     print('end func',b)
    22     return True
    23 
    24 func(1,2)
    25 
    26 #执行结果
    27 #>>>begin func 1
    28 #>>>end func 2
    29 #>>>0.10027241706848145

    2、第二种情况

    装饰器除了可以计算函数的执行时间,还可以记录登录、记录日志等;
    现在假如要访问博客园首页或其他内容的前提,需要用户先登录才能访问,设计装饰器。

     1 import time
     2 login_info = {'alex':False}
     3 def login(func):   # manager
     4     def inner(name):
     5         if login_info[name] != True:
     6             user = input('user :')
     7             pwd = input('pwd :')
     8             if user == 'alex' and pwd == 'alex3714':
     9                 login_info[name] = True
    10         if login_info[name] == True:
    11             ret = func(name)     # timmer中的inner
    12             return ret
    13     return inner
    14 
    15 @login
    16 def index(name):
    17     print('欢迎%s来到博客园首页~'%name)
    18 
    19 @login
    20 def manager(name):
    21     print('欢迎%s来到博客园管理页~'%name)
    22 
    23 index('alex')#由于login_info[('alex']==Flase,所以第一次访问需要登录
    24 index('alex')
    25 manager('alex')
    26 manager('alex')
    27 
    28 #执行结果
    29 #>>>user :alex
    30 #>>>pwd :alex3714
    31 #>>>欢迎alex来到博客园首页~
    32 #>>>欢迎alex来到博客园首页~
    33 #>>>欢迎alex来到博客园管理页~
    34 #>>>欢迎alex来到博客园管理页~

    3、第三种情况

    1)因为要用到两个装饰器,开始之前先解释一下两个装饰器装饰一个函数的执行过程:

     1 def wrapper1(func): 
     2     def inner1():
     3         print('wrapper1 ,before func')
     4         func() 
     5         print('wrapper1 ,after func')
     6     return inner1
     7 
     8 def wrapper2(func): 
     9     def inner2():
    10         print('wrapper2 ,before func')
    11         func() 
    12         print('wrapper2 ,after func')
    13     return inner2
    14 
    15 @wrapper2 
    16 @wrapper1 
    17 def f():
    18     print('in f')
    19 
    20 f()

    2)在第二种情况的基础上还要计算函数index、manger的执行时间:

     1 import time
     2 login_info = {'alex':False}
     3 def login(func):   # manager
     4     def inner(name):
     5         if login_info[name] != True:
     6             user = input('user :')
     7             pwd = input('pwd :')
     8             if user == 'alex' and pwd == 'alex3714':
     9                 login_info[name] = True
    10         if login_info[name] == True:
    11             ret = func(name)     # timmer中的inner
    12             return ret
    13     return inner
    14 
    15 def timmer(f):
    16     def inner(*args,**kwargs):
    17         start_time = time.time()
    18         ret = f(*args,**kwargs)     # 调用被装饰的方法
    19         end_time = time.time()      #
    20         print(end_time - start_time)
    21         return ret
    22     return inner
    23 
    24 @login
    25 @timmer
    26 def index(name):
    27     print('欢迎%s来到博客园首页~'%name)
    28 
    29 @login
    30 @timmer    # manager = login(manager)
    31 def manager(name):
    32     print('欢迎%s来到博客园管理页~'%name)
    33 
    34 index('alex')
    35 index('alex')
    36 manager('alex')
    37 manager('alex')
  • 相关阅读:
    C++ 用宏实现swap(a,b)
    C++ string类的实现
    博客园代码高亮Html转换小程序,Linux/Mac下可用
    C++STL
    数据结构课程设计(基于二叉排序树的身份证管理系统)
    简单模拟B1011
    简单模拟B1001
    双向链表的双向冒泡排序 c++
    IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现
    Java多人聊天室第一版
  • 原文地址:https://www.cnblogs.com/xingye-mdd/p/8948168.html
Copyright © 2011-2022 走看看