首页 > 其他分享 >装饰器

装饰器

时间:2023-06-05 16:57:29浏览次数:25  
标签:index return inner func time 装饰 def

闭包函数

闭包函数的定义

  闭:在函数的内部定义函数,至少定义两层函数

  包:内部的函数使用外部的函数名称空间中的名字

# 使用场景:闭包函数是第二种传参的方式,一次传参,多次调用

装饰器

装饰器的核心思想:在不改变被装饰对象内部代码和原有的调用方式基础之上在添加额外的功能

统计函数的执行时间

#时间模块
import time
def outer(func):
    def get_time():
    #函数执行之前的时间点
        start_time = time.time
        func()
    #函数执行之后的时间点
        end_time = time.time
        print('函数执行了%秒' % (end_time - start_time))
    return get_time

def index():
    time.sleep(2)
    print('from index')
index = get_time(index)
index()

有参数版本

import time
def outer(func):
    def get_time(*args, **kwargs)
        start_time  = time.time()
        func(*args,**kwargs)
        end_time = time.time
        print('函数执行了%秒' % (end_time - start_time))
    return get_time


def index():
    time.sleep(2)
    print('from index')
index = outer(index)
index()

有返回值版本

import time
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time
        func(*args, **kwargs)
        end_time = time.time
        res =end_time -start_time
        return res
    return get_time

def index():
    time.sleep(2)
    print('from index')
index = outer(index)
index()

登录认证功能

def login_auth(func):
    def auth(*args, **kwargs):
        #登录功能
        username = input('username:').strip()
        password = input('password:').strip()
        #判断 用户名和密码是否正确
        if username == 'kevin' and password =='123'
            print('登录成功')
            res = func(*args, **kwargs)
            return res
        else:
            print('用户名或密码错误')
     return auth

@login_auth
def index():
    print('from index')

装饰器的固定模版(语法糖)

def outer(func):
    def inner(*args, **kwargs):
        # 函数执行之前可以添加的功能
        res = func(*args, **kwargs)
        #函数执行之后可以添加的功能
        return res
    return inner

@outer
def index():
    pass
index()

双层语法糖

双重语法糖从下往上走、多重语法糖也是一样的道理,最后都是index = 最上层修饰器(下一层修饰器内部函数) 

def a(func):
    print('a')

    def inner_a(*args, **kwargs):
        print('inner_a')
        res = func(*args, **kwargs)  # 4.inner_b = func  调用inner_b
        return res

    return inner_a


def b(func):
    print('b')

    def inner_b(*args, **kwargs):
        print('inner_b')
        res = func(*args, **kwargs)  # 5.index = func  调用 index
        return res

    return inner_b


@a  # 2. index = a(inner_b)
@b  # 1. inner_b = b(ineer_b)
def index():
    pass


index()  # 3. inner_a = a(inner_b)  调用inner_a

 装饰器修复技术

确保被装饰函数不会因为装饰器带来异常问题

from functools import wraps   # 提出
def a(func):
    print('a')
    @wraps(func)    # 装饰
    def inner_a(*args, **kwargs):
        print('inner_a')
        res = func(*args, **kwargs)
        return res

    return inner_a
@a
def index():
    pass

index()

有参装饰器

def outer(source_data,a,b, *argssss, **kwargsssss):
    # source_data = 'file'
    def login_auth(func):
        def auth(*args, **kwargs):
            # source_data = args[0]
            if source_data == 'file':
                # 来自于文件
            elif source_data == 'mysql':
                # 来自于mysql
            elif source_data == 'oracle':
                # 来自于oracle

            if username =='kevin' and password == '123':
                print('成功')
                func()
            else:
                print('失败')
        return auth
   return login_auth
# @login_auth # index=login_auth(index)
@outer('file'1,2)
def index():
    pass

index('file')

 

标签:index,return,inner,func,time,装饰,def
From: https://www.cnblogs.com/Lucky-Hua/p/17458159.html

相关文章

  • C#设计模式19——装饰器模式的写法
    装饰器模式(DecoratorPattern)是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。What(什么)装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加一些额外的职责,而不需要修改这个对象的代码。在装饰器模式中,你可以定义一个装......
  • 装饰器模式
    TheDecoratorDesignPatternattachesadditionalresponsibilitiestoanobjectdynamically.Thispatternprovideaflexiblealternativetosubclassingforextendingfunctionality.装饰器模式动态的给Object添加额外的职责,这个模式为SubClassing提供灵活的扩展功能。......
  • 装饰器补充(算法)
    算法之二分法就是将一个列表或(其他容器)里面的数排列组合,将要找里面的数的时候从中间切分比较留半,然后再重复,最终至找到或者最后切分为空1x=[11,2,3,44,55,66,77,88,99,100,23,34,45,56,67]2x.sort()3defbijiao(l):4iflen(l)==0:5......
  • 【二十三】Python 中 property() 函数及 @property 装饰器的使用(1)
    【二十三】Python中property()函数及@property装饰器的使用(1)【1】property应用场景在获取、设置和删除对象属性的时候,需要额外做一些工作。比如在游戏编程中,设置敌人死亡之后需要播放死亡动画。需要限制对象属性的设置和获取。比如用户年龄为只读,或者在设置用户......
  • 补充 : 函数之装饰器详解
    函数之装饰器详解装饰器的用途就是为了在不改变原来代码的前提下,将新的功能和函数加入进去【一】简单版本的装饰器#-*-coding:Utf-8-*-#@File:装饰器详解.py#author:Chimengmeng#blog_url:https://www.cnblogs.com/dream-ze/#Time:2023/5/20importtime......
  • Python装饰器
    Python装饰器是一种语法糖,用于修改函数或类的行为,而无需修改其源代码。装饰器是一个可以接受函数或类作为参数,并返回一个新函数或类的函数。它可以用于添加功能,比如缓存、日志、计时等,或者改变函数或类的行为,比如限制访问、检查参数、实现单例等。装饰器通常定义为一个函数,该函数......
  • Python基础之装饰器
    装饰器1、为什么要用装饰器1.1、为程序提供扩展功能的可能性1.2、要遵循开放封闭原则1.3、禁止修改原代码,但是可以新增功能1.4、也不能修改调用方式2、什么是装饰器2.1为被装饰对象添加新功能的工具2.2、不修改被装饰对象源代码和调用方式3、装饰器的核心思想3......
  • < Python全景系列-9 > Python 装饰器:优雅地增强你的函数和类
    欢迎来到我们的系列博客《Python全景系列》第九篇!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。**装饰器在Python中扮演了重要的角......
  • 关于装饰器
    装饰器:*装饰器:本质是一个闭包*作用:核心思想:在不改变被装饰对象内部代码和原有调用方式的基础之上在添加额外的功能装饰器的简易版本:给index函数添加统计执行时间的功能defindex():time.sleep(3)index()----------------------------------------------------......
  • CSS 删除线:在 CSS 中使用文本装饰和划线
    CSS删除线是一个CSS属性,它使文本看起来像是被删除线一样,就像这样。在网络开发和写作中,这经常用于表示文本已被删除或不再相关。但它也可以用于不同的事情。删除线可以应用于span元素、段落、div、显示内联块或任何其他需要文本修饰的元素。除了下划线、斜体和粗体,CSS删除线也......