Python闭包与装饰器

Python闭包与装饰器

闭包

  • 函数内的属性,都是有生命周期的,只存活于函数执行期间

  • 内部函数对外部函数作用域李变量的引用。

  • 闭包内的比包函数私有化了变量,完成了数据的封装,类似于面向对象

  • 闭包在大规模使用时是吃内存的

例子1

def func():#外部函数
	a = 1  #外部函数作用域李的变量
	print("this is func")

	def func1(num):#内部函数
		print('this is func1')
		print(num+a)

	return func1  #函数名

# func()#运行外部函数内部函数就被创建了
# func1()

var = func()
var(3)
del var

运行结果

this is func
this is func1
4

例子2

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

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, 5]
func1 [2, 2, 3, 4, 5]
func1 [3, 2, 3, 4, 5]
func1 [4, 2, 3, 4, 5]

明白闭包之后,才可以很好的掌握装饰器的概念。

装饰器

@func1
def func():
	print("aaa")

不影响原有函数的功能,还能添加新的功能

普通的装饰器


def func1(func):#外部闭包函数的参数是被装饰的函数对象
	def func2():
		print('aaabbb')
		return func()#返回了外部函数接收的被装饰函数的调用
	return func2
#func1() takes 0 positional arguments but 1 was given
#func1(func,arg) missing 1 required positional argument: 'arg'

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

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

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

myprint() #func1(myprint)()
myprint2()

装饰器函数带参数

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

@arg_func(sex='man')
def man(today):
	print('今天是星期',today)
	print('好好上班.')

@arg_func(sex='woman')
def woman(today):
	print('今天是星期',today)
	print('好好上班.')

man(today='2')
woman(today='4')

被装饰的函数带参数

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):
	print( a + b )
mysum(1,2)

#mysum(a,b) -> func1(mysum)(a,b)

参考:https://mp.weixin.qq.com/s/cCjJRwt-MvPjO2vhQbr7FQ

Author face

徐静

数据科学从业者,算法工程师. 善于用数据科学的工具透析业务,模型的线上化部署,网络爬虫及前端可视化. 喜欢研究机器学习,深度学习及相关软件实现.目前自己还是小白一个,希望多多学习.

最近发表的文章