0
点赞
收藏
分享

微信扫一扫

day19-demo04-05&exer02-04

草原小黄河 2022-05-01 阅读 26

函数装饰器 decorator

1. 定义:在不改变原函数的调用以及内部代码情况下,为其添加新功能的函数。

2. 语法

def 函数装饰器名称(func):

def wrapper(*args, **kwargs):

需要添加的新功能

return func(*args, **kwargs)

return wrapper

原函数 = 内嵌函数

@ 函数装饰器名称

def 原函数名称(参数):

函数体

原函数(参数)

3. 本质:使用“@函数装饰器名称”修饰原函数,等同于创建与原函数名称相同的变

量,关联内嵌函数;故调用原函数时执行内嵌函数。 原函数名称 = 函数装饰器名称(原函数名称)

4. 装饰器链: 一个函数可以被多个装饰器修饰,执行顺序为从近到远。

装饰器
    在不改变旧功能基础上,增加新功能
    核心逻辑:
        拦截调用

"""
def func01():
    print("旧功能")


def new_func():
    print("新功能")
"""

"""
def func01():
    print("旧功能")


def new_func(func):  # 得旧功能
    def wrapper():  # 用新旧功能
        print("新功能")
        func()

    return wrapper


# 新功能覆盖了旧功能
# func01 = new_func

# 调用一次外部函数
func01 = new_func(func01)
# 调用多次内部函数
func01()
func01()
"""


def new_func(func):  # 得旧功能
    def wrapper():  # 用新旧功能
        print("新功能")
        func()  # 3.执行旧功能

    return wrapper


# 1.调用外部函数
@new_func  # func01 = new_func(func01)
def func01():
    print("旧功能")


# 2.调用内部函数
func01()
func01()
练习1:不改变插入函数与删除函数代码,
  为其增加验证权限的功能
def verify_permissions(func):
    def wrapper():
        print("验证权限")
        func()

    return wrapper


# insert = verify_permissions(insert)
@verify_permissions
def insert():
    print("插入")


@verify_permissions
def delete():
    print("删除")


insert()
delete()
装饰器 - 语法细节
    内函数返回值:旧功能的返回值

def new_func(func):
    def wrapper(*args, **kwargs):  # 多合一
        print("新功能")
        result = func(*args, **kwargs)  # 一拆多
        return result

    return wrapper


@new_func
def func01(p1):
    print("旧功能1,参数:", p1)
    return 10


@new_func
def func02(p1, p2):
    print("旧功能2,参数:", p1, p2)
    return 20


# 调用内函数
print(func01(100))  # 10
print(func02(200, 300))  # 20
func02(p1=400, p2=500)

 

# 练习1:不改变插入函数与删除函数代码,
#   为其增加验证权限的功能
def verify_permissions(func):
    def wrapper(*args, **kwargs):
        print("验证权限")
        return func(*args, **kwargs)

    return wrapper


# insert = verify_permissions(insert)
@verify_permissions
def insert(p1):
    print("插入")
    return "ok"


@verify_permissions
def delete():
    print("删除")
    return "no"


print(insert(10))
print(delete())

练习 2:为 sum_data,增加打印函数执行时间的功能.

函数执行时间公式: 执行后时间 - 执行前时间

def sum_data(n):

sum_value = 0

for number in range(n):

sum_value += number

return sum_value print(sum_data(10))

print(sum_data(1000000))

import time


def print_execute_time(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        # 执行旧功能
        result = func(*args, **kwargs)
        stop = time.time()
        print("执行时间:", stop - start)
        return result

    return wrapper


@print_execute_time
def sum_data(n):
    sum_value = 0
    for number in range(n):
        sum_value += number
    return sum_value


print(sum_data(10))
print(sum_data(1000000))

举报

相关推荐

day10-demo02&exer02

day16-demo01&exer01

day11-demo01&exer01

2022/02/04

day04

Day04

0 条评论