Python - 闭包(closure) 装饰器(decorator)

本文详细介绍了Python中的闭包和装饰器概念。闭包是函数内部对外部作用域变量的引用,能实现变量私有化和数据封装。装饰器则是一种不改变原函数功能,却能为其添加额外功能的设计模式,通常基于闭包实现。文章通过实例展示了如何使用装饰器以及如何处理装饰器带参数的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

属于Python高阶部分,较难理解,看了多篇博客和教学视频,总结如下:
一 闭包(closure)
函数内的属性都是有生命周期的,都是在函数运行期间
内部函数对外部函数作用域变量的引用
闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象
用于装饰器

def func():
    a = 1
    print('this is func.')
    def func1(num):
        print('this is func1')
        print(num + 1)
    return func1

#func() #运行外部函数,内部函数就被创建了
var = func() #用一个函数变量接受func的返回值,也就是func1

var(2) #运行var

#输出
this is func.
this is func1
3

又如:

mylist = [1,2,3,4]
def func(obj):
    print('func:', obj)
    def func1():
        obj[0] += 1
        print('func1:', obj)
    return func1

var = func(mylist)

var()
var()
var()

#输出
func: [1, 2, 3, 4]
func1: [2, 2, 3, 4]
func1: [3, 2, 3, 4]
func1: [4, 2, 3, 4]

二 装饰器(decorator)
不影响原有函数的功能,还能添加新的功能,可以使用装饰器对函数进行修饰,往往用语法糖
简化代码.而且是基于闭包的.
格式如下:

@func1
def myfunc():

例子 3

def func1(func):
    def func2():
        print('abc')
        return func()
    return func2

'''
return func  返回的是一个函数对象
return func() 返回的是一个函数调用
'''

@func1 #语法糖,等价于 myprint = func1(myprint)
def myprint():
    print('hello')

myprint() #func1(myprint)()

#输出
abc
hello

从结果上看,myprint()函数被装饰了,即在以往的基础上多了一个打印.

被装饰的函数带参数,只需要在内部函数传入参数即可.

def func1(func):
    def func2(x, y):
        x += 5
        y += 5
        return func(x, y)
    return func2

@func1
def mysum(a, b):
    print(a + b)

mysum(1,2)

装饰函数带参数:

def arg_func(sex):
    def func1(your_func):
        def func():
            if sex == 'man':
                print('你不可以生娃')
            if sex == 'woman':
                print('你可以生娃')
            return your_func()
        return func
    return func1

@arg_func(sex = 'man')
def man():
    print('好好上班!')

@arg_func(sex = 'woman')
def woman():
    print('好好上班!')

man()
woman()

#输出
你不可以生娃
好好上班!
你可以生娃
好好上班!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值