十二、装饰器进阶

执行函数的时候* 打散

定义函数的时候* 聚合



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
# 函数的执行时,*打散。
# 函数的定义时,*聚合。
@wrapper  # func1 = wrapper(func1)  func1 = inner
def func1(*args): #args (1,2,3)
    print(666)
    return args
print(func1(*[1,2,3]))  # inner(1,3,5) 打散

打印函数有用信息
@wrapperdef func1():    """    此函数是完成登陆的功能,参数分别是...作用。    :return: 返回值是登陆成功与否(True,False)    """    print(666)    return Truefunc1()print(func1.__name__)print(func1.__doc__)

#666
 func1

此函数是完成登陆的功能,参数分别是...作用。
: return: 返回值是登陆成功与否(True,False)

带参数的装饰器


import timedef timmer(*args,**kwargs):    def wrapper(f):        def inner(*args,**kwargs):            if flag:                start_time = time.time()                ret = f(*args,**kwargs)                time.sleep(0.3)                end_time = time.time()                print(‘此函数的执行效率%f‘ % (end_time-start_time))            else:                ret = f(*args, **kwargs)            return ret        return inner    return wrapper

flag = False@timmer(flag,2,3)  # 两步:1,timmer(flag) --> wrapper 2,@wrapper 装饰器def func1():    print(666)

@timmer(flag)def func2():    print(777)func1()func2()
多个装饰器装饰一个函数
def wrapper1(func): f = func
    def inner1():
        print(‘wrapper1 ,before func‘)
        func()
        print(‘wrapper1 ,after func‘)
    return inner1

def wrapper2(func):  func = inner1
    def inner2():
        print(‘wrapper2 ,before func‘)
        func()
        print(‘wrapper2 ,after func‘)
    return inner2

@wrapper2   然后读@wrapper2   f = inner2
@wrapper1   先读@wrapp1      f = inner1
def f():
    print(‘in f‘)

f()        再读f()

原文地址:https://www.cnblogs.com/yyyyyyyyyy/p/8691938.html

时间: 2024-08-02 14:14:03

十二、装饰器进阶的相关文章

python函数四(装饰器进阶)

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

Python函数--装饰器进阶

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

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

十六.装饰器

装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print '2013-12-25' ... >>> f = now >>> f() 2013-12-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们要增强now()函数的

(十)装饰器模式详解(与IO不解的情缘)

LZ到目前已经写了九个设计模式,回过去看看,貌似写的有点凌乱,LZ后面会尽量改进. 那么本章LZ和各位读友讨论一个与JAVA中IO有着不解情缘的设计模式,装饰器模式. 定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.                  这一个解释,引自百度百科,我们注意其中的几点. 1,不改变原类文件.                  2,不使用继承.                  3,动

第五章 装饰器进阶

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_

装饰器进阶

函数的有用信息 如何给函数添加注释 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__可以查看函数名字 函数名._

19 装饰器进阶

#复习装饰器 def wrapper(func): def inner(*args,**kwargs): print('在此添加调用前代码') ret = func(*args,*kwargs) print('在此添加调用后代码') return ret return inner @wrapper def holiday(day): print('全体放假 %s 天' % day) return '好开心' ret = holiday(3) print(ret) ''' 在此添加调用前代码 全体