[006]Python的函数_装饰器_全栈基础

您好!此笔记的文本和代码以网盘形式分享于文末!

因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!

python的装饰器
定义:在不修改原函数及其调用方式的情况下对原函数功能进行扩展,
            它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。
装饰器的本质:一个闭包函数的自我进化
用法栗子结果
问题
计算函数运行时间
import time

def deco(func):
    start_time = time.time()
    func()
    end_time = time.time()
    execution_time = (end_time - start_time)*1000
    print('time is %d ms' % execution_time)

def f1():
    print('Hello')
    time.sleep(0.2)
    print("world")

deco(f1)
Hello
world
time is 203 ms
装饰器实现
计算函数运行时间
import time

def deco(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
    return wrapper

@deco
def f1():
    print('Hello')
    time.sleep(0.2)
    print("world")

f1()
Hello
world
time is 203 ms
带固定参数函数的装饰器import time

def deco(func):
    def wrapper(a, b):
        start_time = time.time()
        func(a, b)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
    return wrapper

@deco  # ==> f1 = deco(f1)
def f1(a, b):
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))

f1(3, 5)
Hello
result is 8
time is 203 ms
无固定参数函数的装饰器import time

def deco(func):

    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
    return wrapper

@deco
def f1(a, b):
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))

@deco
def f2(a, b, c):
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b+c))

f1(3, 5)
f2(3, 6, 9)
Hello
result is 8
time is 203 ms
Hello
result is 18
time is 203 ms
查看函数信息的方法import time

def deco(func):

    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
    return wrapper

@deco
def f1(a, b):
    """ 没有感情的注释 """
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))

f1(3, 5)
print(f1.__doc__)
print(f1.__name__)
Hello
result is 8
time is 207 ms
None
wrapper
避免
查看函数信息的方法失效
import time
from functools import wraps

def deco(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
    return wrapper

@deco
def f1(a, b):
    """ 没有感情的注释 """
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))

f1(3, 5)
print(f1.__doc__)
print(f1.__name__)
Hello
result is 8
time is 203 ms
 没有感情的注释
f1
带返回值的装饰器import time
from functools import wraps


def deco(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        re = func(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
        return re
    return wrapper


@deco
def f1(a, b):
    """ 没有感情的注释 """
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))
    return 'world'


print(f1(6, 12))
print(f1.__doc__)
print(f1.__name__)
Hello
result is 18
time is 203 ms
world
 没有感情的注释
f1
多个装饰器装饰1个函数import time
from functools import wraps

def deco1(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('This is deco1')
        start_time = time.time()
        re = func(*args, **kwargs)
        end_time = time.time()
        execution_time = (end_time - start_time)*1000
        print('time is %d ms' % execution_time)
        print('deco1 end')
        return re
    return wrapper

def deco2(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('This is deco2')
        re = func(*args, **kwargs)
        print("deco2  end")
        return re
    return wrapper

@deco1
@deco2
def f1(a, b):
    """ 没有感情的注释 """
    print('Hello')
    time.sleep(0.2)
    print("result is %d" % (a+b))
    return 'world'


print(f1(6, 12))
print(f1.__doc__)
print(f1.__name__)
多个装饰器的情况下
f(6, 12) = deco1(deco2(f(6, 12)))




This is deco1
This is deco2
Hello
result is 18
deco2  end
time is 203 ms
deco1 end
world
 没有感情的注释
f1
带参数的装饰器
方便的控制装饰器的开或闭
a = True

def outer(flag):
    def timer(func):  
        def inner(*args, **kwargs):
            if flag:
                print('执行函数前添加的功能代码')
            re = func(*args, **kwargs)
            if flag:
                print('执行函数后添加的功能代码')
            return re
        return inner
    return timer

@outer(a)
def func(x, y):
    b = x + y
    print('x+y的值是:%d' % b)
    return 8

print(func(3, 4))
执行函数前添加的功能代码
x+y的值是:7
执行函数后添加的功能代码
8

 

愿有更多的朋友,在网页笔记结构上分享更逻辑和易读的形式:

链接:暂无
提取码:暂无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值