二十二、闭包和装饰器

一、闭包的概念
'''

1.什么是闭包
闭包其实就是一个函数
2.如何创建闭包
a.要有函数的嵌套(外部函数、内部函数)
b.内部函数中要使用外部函数的变量
c.外部函数必须有返回值,返回内部函数名
3.如何使用闭包
f=funOut(100) #调用外部函数,用f变量指向内部函数
print(type(f))
result=f(200) #通过变量调用函数
'''

#使用闭包,完成求两个数的和
def sum(a,b):
return a+b

def funOut(num1):
def funIn(num2):
#内部函数修改外部函数的变量
nonlocal num1 ----可以调用,但是修改的话,要用nonlocal
num1+=100
return num2+num1
return funIn

funIn=funOut(100)
print(type(funIn))
result=funIn(200)
print('两个数的和:',result)
二、闭包的特殊用途
#闭包的特殊用途:不修改源代码的前提下,添加新的功能
#添加日志输出信息
import time
def writeLog(func):
try:
file=open('wirteLog.txt','a',encoding='utf-8')
#向文件中写入日志信息(访问:方法名 时间:XXXX-XX-XX)
file.write('访问:')
file.write(func.__name__)
file.write(' ')
file.write('时间:')
file.write(time.asctime())
file.write(' ')
except Exception as e:
print(e.args)
finally:
file.close()
def fun1(): #修改了源代码的方式,系统很复杂,可能很多人在调用这个函数,结果你为了自己方便,改了函数,是不可取的
# writeLog(fun1)
print('功能1')
def fun2():
# writeLog(fun2)
print('功能2')

#使用闭包,不修改fun1 和fun2的功能代码,添加日志信息
def funcOut(func):
def funcIn():
writeLog(func)
func()
print('调用',func.__name__,'结束')
return funcIn

fun1=funcOut(fun1)
fun1()
fun2=funcOut(fun2)
fun2()
三、装饰器
闭包是为学习装饰器做铺垫,在 python 程序中,装饰器就是一种闭包,它可以是闭包的访问方式更简单。在 Python 中使用装饰器,需要使用一个特殊的符号“@”来实现。在定义装饰器函数
或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类的定义行之前。在调用的时候,和闭包是相同的,但是可以简化闭包的调用。
#使用装饰器 完成不修改fun1() fun2()函数的源码,添加输出日志信息
import time
def writeLog(func):
try:
file=open('log.txt','a',encoding='utf-8')
file.write('访问:')
file.write(func.__name__)
file.write(' ')
file.write('时间:')
file.write(time.asctime())
file.write(' ')
except Exception as e:
print(e.args)
finally:
file.close()

#使用闭包
def funcOut(func):
def funcIn():
writeLog(func)
func()
return funcIn
#闭包的调用

@funcOut #fun1=funcOut(fun1) 相当于这里是闭包的调用,简化了闭包的调用
def fun1():
print('功能1')

@funcOut
def fun2():
print('功能2')
fun1()
fun2()
原文地址:https://www.cnblogs.com/dangjingwei/p/12766022.html