python闭包和装饰器的深层理解

有时候测试一个库的功能时总是看不懂源码,原因是许多库的封装都是用装饰器实现的,一直想找个机会深入的理解一下python的装饰器。恰好在b站看到讲的很好的老师,笔记在这记录一下

闭包

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

var = func()
var(1)
  • 思想:内部函数对外部函数作用域里变量的引用
  • 作用:为装饰器做语法基础

普通装饰器

def func1(func):# 这个func就是用来接收函数名的
	def func2():
		print('1111')
		return func()
	return func2

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

myprint()

原理和过程:

此时myprint()转化为func1(myprint)(),此时会先执行func2,然后再执行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()

原理和过程:

此时执行执行man()相当于执行arg_func(sex=‘man’)()()

带着参数的arg_func–>func1()–>func2()–>b_func()(被我我们装饰的函数)

被装饰的函数带参数(常用)

def func1(func):
    def func2(x,y):
        print(x,y)
        x+=5
        y+=5
        return  func(x,y)
    return func2
@func1
def mysum(a,b):
    print(a+b)
    
mysum(1,2)

原理和过程:

此时mysum(1,2)转化为func1(mysum)(1,2),可以用来对输入进来的形参进行修改,在实际应用中比较常见

笔记和思想

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csk9ZBr2-1638508796045)(C:\Users\zh006\AppData\Roaming\Typora\typora-user-images\image-20211203083947361.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RsuNz6y-1638508796047)(C:\Users\zh006\AppData\Roaming\Typora\typora-user-images\image-20211203084055417.png)]

总结

闭包

  • 闭包里的内部函数对外部函数作用域里变量的引用
  • 闭包里的闭包函数私有化了变量,完成了数据的封装,类似于面向对象的作用域

修饰器

普通修饰器:func(arg)()

装饰器函数带参数:func(arg=‘a’)()()

被装饰的函数带参数:只需要再最内部函数传入参数,func(func_name)(agr)

b站视频

上一篇:递归函数怎么写


下一篇:win10系统 tensorflow-gpu 2.6.0环境搭建 RTX3070显卡