装饰器

装饰器:在不改变原函数和原函数执行状态下,为函数增加功能

万能装饰器:

def wrapper(func):
    def inner():
        """执行函数之前的功能"""
        ret = func()
        """执行函数之后的功能"""
        return ret
    return inner
@wrapper  #func = wrapper(func)
def func():
    pass
func()

 eval: 读取文本内容的时候,都是字符串,可以用eval转换一下,本身什么类型,就读出什么类型

开放封闭原则:

1、 对扩展是开放的

2、 对修改是封闭的

函数的有用信息:

def f1():
    '''
    本函数的功能:绘图功能,实时接收数据并绘图.
    :return: 绘图需要的数据,返回给前端某标签
    '''
    print(f1.__doc__)            #打印注释
    print(f1.__name__)         #打印函数名字
f1()
#输出:

      本函数的功能:绘图功能,实时接收数据并绘图.
      :return: 绘图需要的数据,返回给前端某标签

          f1

有装饰器的情况下打印有用信息:

rom functools import wraps
def wrapper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        '''执行函数前进行的操作'''
        ret = func(*args,**kwargs)
        '''执行函数后进行的操作'''
        return ret
    return inner

@wrapper
def f1():
    '''
    本函数的功能:绘图功能,实时接收数据并绘图.
    :return: 绘图需要的数据,返回给前端某标签
    '''
    print(f1.__doc__)
    print(f1.__name__)
f1()

*args 和**kwargs:

def wrapper(func):
    def inner(*args,**kwargs):
        '''执行函数前'''
        ret = func(*args,**kwargs)
        '''执行函数后'''
        return ret
    return inner

@wrapper
def func(a,b,c,d):      #接收函数时,加个*聚合
    print(111)    
func(1,2,3,4)

# f1(*[1,2,3,4])        #执行函数时,加个*打散

带参数的装饰器:

 可以当作装饰器的开关

import time
flag = True                             #flag = True  则装饰,flag = Flag  则不装饰,只执行原函数 
def timmer(f):
    def wrapper(func):
        def inner(*args,**kwargs):
            if f:
                start_time = time.time()
                ret = func(*args,**kwargs)
                end_time = time.time()
                print(end_time - start_time)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return wrapper
@timmer(flag)
def func():
    print(123)
func()

一个装饰器装饰多个函数:

def wrapper1(func):
    def inner1(*args,**kwargs):
        print(1)
        ret=func(*args,**kwargs)
        print(2)
        return ret
    return inner1
def wrapper2(func):
    def inner2(*args,**kwargs):
        print(3)
        ret=func(*args,**kwargs)
        print(4)
        return ret
    return inner2

@wrapper1
@wrapper2
def func():
    print(5)
func()
#输出:1   3   5   4    2
原文地址:https://www.cnblogs.com/pygg/p/8418773.html