被封闭起来的函数-->定义函数内部的函数,闭函数的特点是:只能在函数内用
该函数引用了一个名字,该函数是来自与 E 这一层的
指的是在定义在函数内部的函数,引用了一个来自外层作用域中的名字
def f1():
x = 1
def f2():
print(x)
return f2
res = f1()
res()
# 1
装饰器指的是装饰别人的工具,装饰指的是为被装饰者添加新功能。
但是实现装饰器必须遵守原则:开放封闭原则
开放:对扩展新功能是开放的
封闭:对修改源代码以及调用方式是封闭的
综上:装饰器指的是创建一个工具,可以在遵循原则1,2的前提下:
原则1:不修改被装饰对象源代码
原则2:不修改被装饰对象调用方式
def ti(): #统计程序运行时间
print(‘你好‘)
time.sleep(1)
def y(x): # 装饰器
def tj(*args,**kwargs):
start = time.time()
res = x(*args,**kwargs)
end = time.time()
print(‘运行时间为:%s‘%(end - start))
return tj
ti = y(ti)
ti()
@ +修饰器函数名
import time
def y(x): # 装饰器
def tj(*args,**kwargs):
start = time.time()
res = x(*args,**kwargs)
end = time.time()
print(‘运行时间为:%s‘%(end - start))
return tj
@y # 语法糖
def ti(): #统计程序运行时间
print(‘你好‘)
time.sleep(1)
ti()
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
封装3层的闭包函数
def f1(name):
def f2(func):
def f3(*args,**kwargs):
res = func(*args,**kwargs)
print(name)
return res
return f3
return f2
@f1(‘sailiya‘)
def name():
print(‘你好啊‘)
name()
# 你好啊
# sailiya
def f1(mode):
def f2(func):
def f3(*args, **kwargs):
name = input(‘name:‘)
pwd = input(‘pwd:‘)
if mode == 1:
if name == ‘1‘ and pwd == ‘2‘:
res = func(*args, **kwargs)
return res
else:
print(‘认证失败‘)
elif mode == 2:
print(‘这是第 %s 种验证方式‘ % mode)
else:
print(‘此验证方式当前关闭维护中‘)
return f3
return f2
number = int(input(‘选择验证方式:1,2,3\n‘))
@f1(number)
def name():
print(‘登录成功‘)
name()
from functools import wraps
def f1(func):
@wraps(func)
def f2(*args,**kwargs):
res = func(*args,**kwargs)
return f2
原文:https://www.cnblogs.com/BaiJiaZhengMing/p/14598366.html