首页 > 其他分享 >闭包与装饰器

闭包与装饰器

时间:2024-07-23 11:29:31浏览次数:15  
标签:闭包 函数 call print 或类 装饰 def

闭包

定义
闭包函数是指能够访问另一个函数作用域中变量的函数。当内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和其他内部函数时,如果其中一个这样的内部函数在包含它们的外部函数之外被调用,就会形成闭包,外部函数能将内部函数返回,内部函数能够访问内部函数的局部变量。

def fun1():
    print("fun1")
    dates =[1, 2, 3, 4, 5]

    def fun2():
        print("fun2", dates)

    return fun2


r = fun1()
r()

在这里插入图片描述

装饰器

装饰器是python的一种很巧妙的功能,它允许用户在不修改函数或类原有代码的基础上,给函数或类动态地添加额外的功能。装饰器本质上是一个函数或类,它接受一个函数或类作为输入,并返回一个新的函数或类作为输出。

装饰器的定义与特性

定义:装饰器在代码运行期间动态增加功能的方式,称之为“装饰器”。装饰器本质上是一个Python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下,动态增加功能。
特性:
函数或类:装饰器可以是一个函数或类。
不修改原代码:能够在不修改原函数或类代码的前提下,为其增加额外的功能。
返回函数或类对象:装饰器的返回值也是一个函数或类对象。

装饰器的使用场景

插入日志:记录函数的调用情况、参数、返回值等。
性能测试:统计函数或方法的执行时间,以评估性能。
事务处理:确保一系列操作要么全部成功,要么在遇到错误时全部回滚。
缓存:缓存函数的执行结果,避免重复计算,提高程序性能。
权限校验:检查用户是否有权限执行某个操作。

装饰器的案例

由于水平有限展示基础案例:
用装饰器验证核验操作

user = None


def name_psd_msg(f):
    def check():
        global user
        if user:
            f()
        else:
            while True:
                user_name = input("输入用户名")
                password = input("输入密码")
                if user_name == "admin" and password == "123456":
                    user = user_name
                    f()
                    break


                else:
                    print("输入错误")
    return check


def index():
    print(f"我是首页")


@name_psd_msg
def center():
    print(f"我是个人中心")


@name_psd_msg
def cart():
    print(f"我是购物车")


index()
center()
cart()

在这里插入图片描述
装饰器主要分为两种类型:函数装饰器和类装饰器。

函数装饰器:

函数装饰器是最常见的装饰器类型,它接受一个函数作为输入,并返回一个新的函数作为输出。
基本语法是在函数定义之前,使用@符号加上装饰器的名称来应用装饰器。
示例代码:

def my_decorator(func):  
    def wrapper():  
        print("Before function call")  
        func()  
        print("After function call")  
    return wrapper  
 
@my_decorator  
def say_hello():  
    print("Hello!")  
 
say_hello()  # 输出:Before function call,Hello!,After function call

类装饰器:

类装饰器是以类作为装饰器的实现方式,它允许使用类来实现装饰器的功能。
类装饰器通常定义了一个类,并在实例化这个类时传入一个函数作为参数,然后这个类返回一个修改后的函数。
示例代码:

class MyDecorator:  
    def __init__(self, func):  
        self.func = func  
 
    def __call__(self, *args, **kwargs):  
        print("Before function call")  
        result = self.func(*args, **kwargs)  
        print("After function call")  
        return result  
 
@MyDecorator  
def say_hello():  
    print("Hello!")  
 
say_hello()  # 输出:Before function call,Hello!,After function call

通过装饰器,我们可以实现代码的重用、日志记录、性能测试、事务处理、缓存、权限校验等多种功能。

标签:闭包,函数,call,print,或类,装饰,def
From: https://blog.csdn.net/vloggyh/article/details/140625458

相关文章

  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • python——闭包与装饰器
    闭包与装饰器1.闭包 定义闭包的三要素:外部函数嵌套内部函数外部函数将内部函数返回内部函数可以访问外部函数的局部变量了解三要素之后就可以定义一个闭包了deffun1(x):#外部函数嵌套fun2deffun2():print(x)#内部函数访问外部函数的局部变量ret......
  • Python—装饰器
    Python装饰器(decorators)是一种强大且灵活的特性,它允许在不修改原有函数代码的情况下,为函数增加新的功能。装饰器本质上是一个函数,它可以接收一个函数作为参数,并返回一个新的函数。这个新函数是对原函数的一种包装或增强。一、示例详解importrandomimporttimedata=[ra......
  • Python 装饰器 详解+案例
    Python装饰器是一种特殊的函数,用于修改其他函数的功能。装饰器可以在不改变原函数代码的情况下,对函数进行增加、修改或者扩展功能。装饰器的语法形式是在函数定义前使用@符号,并在@后面加上装饰器的名称。装饰器函数接受被装饰函数作为参数,并返回一个修改后的函数。impo......
  • 博文标题:探索Python中的元编程:装饰器的魔法
    引言在Python的世界里,装饰器(Decorators)是一种非常强大的特性,它允许程序员在不修改原始函数代码的情况下,为函数添加新的功能。这种机制不仅增强了代码的可读性和可维护性,还提供了高度的灵活性和扩展性。本文将深入探讨装饰器的基本概念、工作原理以及如何利用它们来简化和......
  • 如何在Python中使用装饰器动态创建类方法?
    我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:装饰器应该从外部配置(例如字典)读取方法定义。装饰器应该动态地将这些方法添加到类中。每个生成的方法都应具有配置中指定的自己唯一的实现。以......
  • 千字长文讲解python装饰器
    1.装饰器是一个用于封装函数或类的代码的工具。它显式的将封装器应用到函数或类上,从而使它们选择加入到装饰器的功能中【装饰器不仅可以装饰函数,也可以装饰类】。2.对于①在函数运行前处理常见前置条件(例如确认授权),或②在函数运行后确保清理(例如输出清除或异常处理)装饰器都......
  • Python中的`@property`装饰器:深入解析与实战应用
    Python中的@property装饰器:深入解析与实战应用在Python中,@property装饰器是一种强大的工具,它允许类的方法被当作属性来访问。这一特性极大地增强了类的封装性和易用性,使得类的外部使用者可以像访问普通属性一样访问由方法计算或处理过的数据,而无需直接调用这些方法。本文将......
  • JavaScript复习记录(6)— 对闭包的理解,闭包使用场景
    闭包(Closure)指的是一个函数可以访问其外部作用域(即使这个函数是在外部作用域之外执行的)。换句话说,闭包是函数和声明该函数的词法环境的组合。闭包的形成闭包在以下情况下形成:当一个内部函数被保存到外部后,即使外部函数已经执行完毕,内部函数仍然可以访问外部函数中的变量。......
  • 八、函数高级、装饰器
    文章目录学习目标一、递归函数二、匿名函数三、列表相关的一些方法3.1sort与sorted方法3.2filter内置类3.3map内置类3.4reduce四、常用内置函数总结五、高阶函数5.1函数的嵌套5.2闭包的概念六、装饰器6.1计算一段代码的执行时间6.2优化......