闭包和装饰器

闭包:

函数内的属性,都有生命周期,都是在函数执行期间
内部函数对外部函数 作用域 里 变量 的引用
闭包内的闭包函数私有化了变量,完成了数据的封装,类似于面向对象

装饰器:

 在不影响原有函数功能前提下,还能添加新的功能
 基于闭包

闭包 - example 1

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

var = func()
var(3)

从上例可以看出

骨架核心代码:

def func():
	def func1(num):
	...
	return func1

var = func

通过函数中定义函数,进行返回,达到在函数外可以得到函数内的参数

百度百科:闭包就是能够读取其他函数内部变量的函数。

在这里插入图片描述

即通过将 c 返回出来,可以得到 b 内的信息

其中,在 example 1中两个 a 的地址相同

闭包 - example 2

my_list = [1,2,3,4,5]

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

var = func(my_list)
var()
var()
var()

在这里插入图片描述

装饰器 - example 1

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

@func1
def myprint():
    print('你好,我是 print')

装饰器内部实现:

return func 返回了函数对象,相当于返回的是 func()

return func() 返回了一个 函数调用

1 func1(myprint)() —> func2 # 接收被装饰的函数作为参数,而且还要继续调用一次

2 func2() ----> print(‘aaabbb’) ----> return func() ----> print(‘你好,我是print’)

核心代码

def func1(func):
    def func2():
        
        return func()
    return func2

通过闭包丰富内容,传参,执行本身函数

装饰器 - example 2 装饰器带参数

arg_func(sex = 'man')()() ---> func1
func1() ---> func2
func2() --->  ('你不可以生娃') or ('你不可以生娃')    b_func

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

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


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


man()
woman()

装饰器 - example 3 被装饰的函数带参数

def func1(func):
    def func2(x, y):
        print(x, y)
        x = 'a'
        y = 'b'
        return func(x, y)
    return func2

@func1
def mysum(a, b):            # 实现 a = a + 5
    print(a + b)

mysum(1,2)

鸣谢B站UP主:15112899479
学习视频链接:https://www.bilibili.com/video/av18586448

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值