python中的函数#3

2023-12-19 21:08:26

一. 装饰器

1.装饰器的概念

装饰器;函数装饰器是Python中的一种特殊的函数,它可以用来修改、增强或者包装其他函数的功能。函数装饰器接受一个函数作为参数,并返回一个函数。通过使用函数装饰器,可以在不修改原函数代码的情况下,在其前后或者中间添加一些额外的功能或者行为。

器:指的是工具

装饰:添加功能

装饰器的核心思想:在不改变原来的调用方式和内部代码的基础上来添加功能

2.装饰器的固定模版

装饰器的固定模版有个口诀:客人空手来,还得请上楼;干啥都同意,有参给上楼.


##:客人(fucn)空手来,还得请上楼(index里的func);干啥都同意(输入的是*args,**kwargs),有参给上楼(f1所在的括号里).

def index(func):
    def f1(*args, **kwargs):
        print('开始执行')
        res = func(*args, *kwargs)
        print('执行完毕')
        return res
    return f1

1. 语法糖的书写规范:
? ? @装饰器名字
? ? 必须把上面的写在被装饰对象的头上(紧贴着被装饰对象写)

def index(func):
    def info():
        print('开始执行')
        res = func()
        print('执行结束')
        return res
    return info

@index
def origin():
    print('函数')
origin()


? ??
2. 语法糖的原理:
? ? 它会把下面的被装饰对象的名字当成参数传递给装饰器

二. 装饰器进阶版本

1.解决参数的问题
import time
def index():
    time.sleep(2)
    print('小李')

def home(name):
    time.sleep(2)
    print('志乃')
def outer(func):
    def outer(func):##func:index func = home
    def get_time(*args,**kwargs):
        start_time = time.time()
        func(*args,**kwargs)
        end_time = time.time()
        print(end_time-start_time)
    return get_time

func = outer(func)
func()
2. 解决返回值的问题
import time
def index():
    time.sleep(2)
    print('小李')

def home(name):
    time.sleep(2)
    print('志乃')
def outer(func):
    def get_time(*args,**kwargs):
        start_time = time.time()
        res= func(*args,**kwargs)
        end_time = time.time()
        print(end_time-start_time)
        return res
    return get_time
home = outer(home)
res =home('jerry')
print(res)

我们现在统计函数有时需要参数,有时不需要,所以当我们不确定要不要传参数时,使用*args和**kwargs

3.双层语法糖
import time
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res
    return get_time


def login_auth(func):
    def auth():
        username = input('账号').strip()
        password = input('密码').strip()
        if username == 'kiki' and password == '123':
            print('登录成功')
            func()
        else:
            print('登录失败')
    return auth
@login_auth
@outer
def index():
    time.sleep(2)
    print('form index')

index()

注: 双层语法糖的顺序为定义时从上而下的,而调用时是从下往上

4. 多层语语法糖

和双层语法糖一样,不过当最后的语法糖调用时,使用的则是最初的函数

def outer1(func1):
    print('outer1')
    def weeper1(*args, **kwargs):
        print('weeper1')
        res = func1(*args, **kwargs)
        return res
    return weeper1

def outer2(func2):
    print('outer2')
    def weeper2(*args, **kwargs):
        print('weeper2')
        res2 = func2(*args, **kwargs)
        return res2
    return weeper2


def outer3(func3):
    print('outer3')
    def weeper3(*args, **kwargs):
        print('weeper3')
        res3 = func3(*args, **kwargs)
        return res3
    return weeper3

@outer3
@outer2
@outer1
def index():
    print('form index')
index()

5. 有参装饰器
def outer(source_type, *a, **k):
    def login_auth(func):
        def auth(*args, **kwargs):
            username = input('请输入你的账号')
            password = input('请输入你的密码')
            if source_type == 'file':
                print('获取密码')
            if username == 'kiki' and password == '123':
                print('登录成功')
                func(source_type, *args, **kwargs)
            else:
                print('登录失败')
        return auth
    return login_auth

@outer('file')
def home(*a, **b):
    pass
home('lll')

文章来源:https://blog.csdn.net/weixin_49210718/article/details/132763231
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。