第五章 装饰器进阶

1.对大批量函数添加装饰器,而且不定期的开关

# 多个装饰器,添加批量管理的开关
import time
FLAG = False
def outer(flag):
    def timer(f1):
        def inner(*args,**kwargs):
            if flag == True:
                start_time = time.time()
                ret = f1(*args,**kwargs)
                end_time = time.time()
                print(‘运行时间为 %s‘ % (end_time-start_time))
            else:
                ret = f1(*args,**kwargs)
            return ret
        return inner
    return timer

@outer(FLAG)
def func1(a, b):
    print(‘func1开头 -- %s‘ % a)
    time.sleep(0.1)
    print(‘func1结尾 -- %s‘ % b)

@outer(FLAG)
def func2(a, b):
    print(‘func2开头 -- %s‘ % a)
    time.sleep(0.1)
    print(‘func2结尾 -- %s‘ % b)
# func1开头 -- a
# func1结尾 -- b
# func2开头 -- c
# func2结尾 -- d

2.使用装饰器进行登录检测

# 第二种情况
# 使用装饰器进行登陆检测,如果已经登陆,则不用再次登陆
#
import time
login_info = {‘alex‘:False}

def login(func1):
    def inner(name):
        if login_info[name] != True:
            user = input(‘user: ‘)
            pwd = input(‘pwd: ‘)
            if user == ‘alex‘ and pwd == ‘alex3714‘:
                login_info[name] = True
        if login_info[name] == True:
            ret = func1(name)
            return ret
    return inner

def timmer(f):
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = f(*args,**kwargs)
        end_time = time.time()
        print(end_time-start_time)
        return ret
    return inner

@login # index = login(index) -- inner
@timmer
def index(name):
    print(‘欢迎%s来到博客园首页---‘ % name)
    time.sleep(0.3)

@login
@timmer
def manager(name):
    print(‘欢迎%s来到博客园管理界面---‘ % name)
    time.sleep(0.3)

index(‘alex‘)
manager(‘alex‘)
index(‘alex‘)
manager(‘alex‘)

# user: alex
# pwd: alex3714
# 欢迎alex来到博客园首页---
# 0.30012965202331543
# 欢迎alex来到博客园管理界面---
# 0.30124926567077637
# 欢迎alex来到博客园首页---
# 0.3006711006164551
# 欢迎alex来到博客园管理界面---
# 0.3006777763366699

3.多个装饰器装饰一个函数,结构类似套娃

# 多个装饰器装饰一个函数,结构类似于套娃结构
def wrapper1(f1): #f
    def inner1():
        print(‘wrapper1 before func‘)
        f1() # f
        print(‘wrapper1 after func‘)
    return inner1

def wrapper2(f2): #inner
    def inner2():
        print(‘wrapper2 before func‘)
        f2() # inner1
        print(‘wrapper2 after func‘)
    return inner2

# 在装饰器执行的时候,是从下向上依次执行
@wrapper2 # f = wrapper2(inner1) --> inner2
@wrapper1 # f = wrapper1(f) --> inner1
def f():
    print(‘in f‘)

f()  #inner2
# wrapper2 before func
# wrapper1 before func
# in f
# wrapper1 after func
# wrapper2 after func
# 运行过程
def wrapper1(f1): # 3- f1 = f
    def inner1():
        print(‘wrapper1 before func‘) ## 14=
        f1() ## 15= f()
        print(‘wrapper1 after func‘) ## 17=
    return inner1  # 4- inner1

def wrapper2(f2): # 7- f2 = inner1
    def inner2():  ## 11=
        print(‘wrapper2 before func‘) ## 12=
        f2() ## 13= inner1
        print(‘wrapper2 after func‘) ## 18=
    return inner2  # 8- inner2

# 在装饰器执行的时候,是从下向上依次执行

# 当遇到多个装饰器装饰一个函数的时候,会一直向下走,直到找到被装饰的函数
# 是一个先往下走,再往上回的过程
@wrapper2 # 6- f = wrapper2(f) --> f = wrapper2(inner1) # 9- f = inner2 **** 装饰过程结束
@wrapper1 # 2- f = wrapper1(f)  # 5- f = inner1 --> f
def f(): # 1- 从找到的f开始
    print(‘in f‘) ## 16=

f()  # 10- 开始调用 f()相当于inner2()

原文地址:https://www.cnblogs.com/gnaix/p/8993580.html

时间: 2024-11-13 01:05:21

第五章 装饰器进阶的相关文章

python函数四(装饰器进阶)

一.开放封闭原则 1.对扩展是开放的 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 比如我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了开放封闭原则. 二.函数的有用信息 def func(): ''' 本函数主要用于绘图,实时接收数据 :return:返回给前端某标签 ''' print(func.__doc

Python函数--装饰器进阶

开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 为什么要对修改封闭呢? 就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了这个开放封闭原则. *args,**kwargs def f1(*args,**kwargs):   接

第8章 装饰器、模块和包

一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用实例 一 什么是装饰器

Python 第五天 装饰器

装饰器 装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作. 1 def wrapper(func): 2 def result(): 3 print 'before' 4 func() 5 print 'after' 6 return result 7 8 @wrapper 9 def foo(): 10 print 'foo' 1 import functools 2 3 4 def wrapper(func): 5 @fun

Python学习之装饰器进阶

函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) aaa(1,2) 默认参数:不是必须传参数 def bbb(x=10): print(x) # bbb() #x = 10 # bbb(20) #x = 20 动态传参 def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1

十二、装饰器进阶

执行函数的时候* 打散 定义函数的时候* 聚合 from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(*args,**kwargs): #聚合 #args (1,2,3) '''执行函数之前的相关操作''' ret = f(*args,**kwargs) # 打散 1,2,3 '''执行函数之后的相关操作''' return ret return inner # 函数的执行时,*打散. # 函数的定

Python学习笔记__4.4章 装饰器(添加额外功能)

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 装饰器可以帮助我们为已经存在的对象添加额外的功能 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 装饰器经常用于有切面需求的场景,比如:插入日志.性能测试.事物处理.缓存.权限校验等场景. 1.1.为now函数 加一行日志 # 定义now函数 def now(): print('2018-5-8') # 编辑decorator def log(func):

装饰器进阶

函数的有用信息 如何给函数添加注释 def func(*args,**kwargs): """ 这里是函数的注释,先写?下当前这个函数是?什么的 :param args:参数args是什么意思 :param kwargs:参数kwargs是什么意思 :return:返回值是什么 """ print("哈哈") 如何获取到函数的相关信息 def func(*args,**kwargs): """ 这

python 基础篇 12 装饰器进阶

本节主要内容:1. 通?装饰器回顾2. 函数的有?信息3. 带参数的装饰器4. 多个装饰器同时装饰?个函数 ?. 通?装饰器的回顾开闭原则: 对增加功能开放. 对修改代码封闭装饰器的作?: 在不改变原有代码的基础上给?个函数增加功能通?装饰器的写法: 执行过程: 其实执行  target_func()就是执行inner函数.  inner函数会先执行目标函数之前的代码,然后执行目标函数,之后再执行目标函数之后的代码. 如何获取函数的有用信息: 函数名.__name__可以查看函数名字 函数名._