装饰器

装饰器的概念

就是所有东西组合在一起的就是装饰器。(如闭包函数,名称空间)

装饰器的简易版本

复制代码
import time


def login():
    time.sleep(2)
    print('from login')


def func(index):
    def all_func():
        start_time = time.time()
        index()
        end_time = time.time()
        print(end_time - start_time)

    return all_func


res = func(login)
res()
复制代码

 

装饰器的进阶版本

进阶版本就是解决了函数的传参问题

复制代码
import time


def login(name):
    time.sleep(2)
    print('from login', name)


def func(index):
    def all_func(*args, **kwargs):
        start_time = time.time()
        index(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)

    return all_func


res = func(login)
res('bxf')
复制代码

 

解决函数返回值问题

在每个函数后加上返回值(return后面的),就能解决返回值问题

复制代码
import time


def login(name):
    time.sleep(2)
    print('from login', name)
    # return 'from login'


def func(index):
    def all_func(*args, **kwargs):
        start_time = time.time()
        res = index(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res
    return all_func


res = func(login)
res1=res('bxf')
print(res1)
复制代码

 

装饰器的固定模板

复制代码
def func(*args, **kwargs):
    print('form func')
    return 'from func'


def index(*args, **kwargs):
    def index1():
        print('调用函数之前运行的代码')
        res = func(*args,**kwargs)
        print('调用函数之后运行的代码')
        return res

    return index1() 
复制代码

 

装饰器的语法糖

用@+函数名,就可以直接代替函数传参的形式,直接调用需要使用的函数就可以,此代码必须加在你要用的函数之上。

复制代码
import time


def func(index):
    def all_func(*args, **kwargs):
        start_time = time.time()
        res = index(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
        return res

    return all_func


@func
def login(name):
    time.sleep(2)
    print('from login', name)
    # return 'from login'


login('bxf')
复制代码

 

装饰器的双层语法糖

复制代码
import time


def func(func):
    def all_func():
        start_time = time.time()
        func()
        end_time = time.time()
        print(end_time - start_time)

    return all_func


def login_auth(func):
    # func = index
    def auth():
        # 1. 让用户输入用户名和密码
        username = input('username:').strip()
        password = input('password:').strip()

        # 2. 判断用户名和密码
        if username == 'ly' and password == '123':
            func()  # inner()
        else:
            print('输入错误,不能调用函数')

    return auth  # 一定别忘记把内层函数的函数名返回出去




@login_auth
@func
def login():
    time.sleep(2)
    print('from login')

login()
复制代码

 

有参装饰器

复制代码
import time


def index(date):
    def func(index1):
        def all_func():
            if date == 1:
                start_time = time.time()
                index1()
                end_time = time.time()
                print(end_time - start_time)
            elif date == 2:
                print('这是2')
            elif date == 3:
                print('这是3')

        return all_func

    return func


# date = input('请输入序号:')

date = int(input('请输入序号:'))


@index(date)
def login():
    time.sleep(2)
    print('from login')


login()
复制代码

 

posted @   shangxin_bai  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示