Python学习笔记 18

闭包和装饰器

  • 闭包能隐藏数据,类似于私有变量,防止其他人修改变量
  • 装饰器是在OCP原则( Open Close Peinciple , 即开闭原则 )下修改别人代码,公司的合作项目
# 将函数作为返回值返回,也是一种高阶函数,称之为闭包
# 闭包可以创建一些只有当前函数能访问的的变量
# 	可以将一些私有的数据藏到闭包中

def fn() :
	private = '私有数据'
	n = 99
	# private,n都是函数内的局部变量,其他人无法修改
	def inner():
		print(private,n)
	return inner

r = fn( )
r( )

# 形成闭包的必要条件
# 1. 函数嵌套
# 2. 将内部函数作为返回值返回
# 3. 内部函数必须用到外部函数的变量

# 用闭包求一个list的平均值
def make_average( ) :
	num=[ ]
	def average(a) :
		num.append(a)
		return sum(num)/len(num)
	return average

average =make_average()
# average是函数外的变量,与函数内的def average(a) 无关系
average(4)
average(3)
print( average(5) )



# 开闭原则(OCP,Open Close Peinciple):
# 	- 在程序设计中,要开放对程序的扩展,关闭对程序的修改

# 装饰器
# 在开发中我们都是通过@装饰器来扩展函数功能
# 一个函数可以指定多个装饰器,函数将会由内向外的顺序一层一层被装饰

def fn3( ) :
	print('这是fn。。')

def add(a,b) :
	r = a+b
	return r
def mul(a,b) :
	r = a * b
	return r
# ----
def new_add(a,b) :
	print('开始。。。。')
	r = add(a,b)
	print('结束。。。。')
	return r
# 函数的参数情况不一致,一个一个的创建麻烦
result = new_add(123,345)
print(result)
print()

def begin_end( function ) ->function :
	'''
		这是一个装饰函数,扩展原函数
		参数:
			function是要扩展的方法函数
	'''
	def new_function( *args , **kwargs ) :
	# 参数装包
		print('开始。。。。')
		r = function( *args , **kwargs )# 把参数解包
		print('结束。。。。')
		return r
	return new_function

a = begin_end(fn3)# a是fn3更新后的方法
a()

b = begin_end(add)# b是add更新后的方法
print( b(13,56) )
print( )

# 常用方法:直接在@后面加上装饰器名,下一行写要装饰的函数
@begin_end 
# @A
# @B
# 装饰器有多个时:函数将会由内向外的顺序一层一层被装饰,先执行B再执行A
def say_hello( ) :
	print('hello...')

say_hello( )


# 多个装饰器时:
def RR( function ) ->function :
	'''
		这是一个装饰函数,扩展原函数
		参数:
			function是要扩展的方法函数
	'''
	def new_function( *args , **kwargs ) :
	# 参数装包
		print('RRR。。。')
		r = function( *args , **kwargs )# 把参数解包
		print('LLLL。。。')
		return r
	return new_function

@begin_end
@RR
def fn5() :
	print('我是f5')

fn5( )

猜你喜欢

转载自blog.csdn.net/weixin_44011689/article/details/89522455
今日推荐