Python装饰器与闭包
闭包
闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数;
# 闭包
def wrapper():
a = 10
print('wrapper')
def inner():
print(a + 20) # 在内部函数中必须引用外部函数中定义的变量
return inner
print(wrapper) # 函数名代表的是函数在代码中的地址
# 函数名后面带括号,表示函数引用,函数调用必然返回一个值,
#函数调用可以看做一个值
wrapper()()
输出结果:
装饰器
python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。装饰器,装饰的对象是函数或者方法。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能、性质。
def ori(name):
print(f"这是需要被装饰的内容...——装饰方法{name}")
# 装饰器
def outer(func):
def inner(name):
print("*" * 50)
func(name)
print("*" * 50)
return inner
# 此处发生偷梁换柱的概念,ori实际执行outer函数中的inner函数
ori = outer(ori)
ori('hello_world')
输出结果:
增强装饰器
# 增强装饰器
@outer # 等价于 add = outer(name)
def add(name):
print(f"这是需要被装饰的内容...——装饰方法——{name}")
add("world hello")
输出结果:
装饰器改进,不限制参数
def add_outer(func): # func 必须传入一个函数
def inner(*args, **kwargs):
print("*" * 50)
# 固定用法,把传给inner实参原封不动传给被修饰的函数
func(*args, **kwargs)
print("*" * 50)
return inner
@add_outer
def demo(a, b):
print(a + b)
@add_outer
def demo2(a):
print(a)
demo(5, 4)
demo2(11)
输出结果:
装饰器使用示例——用户登录页面
NAME = '小明'
PASSWORD = '233'
# 登录方法 ——需要被装饰
def login():
name = input('请输入用户名\n')
password = input('请输入密码\n')
if name == NAME and password == PASSWORD:
print('登录成功...')
return True
else:
print('账号或密码不对,请重新输入...')
return False```
# 登录逻辑
def check_login(func):
def inner():
if func():
print('登录成功...')
else:
login()
return inner
# 登录页面
@check_login
def manager():
print('请登录管理中心')
manager()
输出结果:
类装饰器
class Decrator:
def __call__(self, func):
def inner(*args, **kwargs):
print("*"*50)
func(*args, **kwargs)
print("*" * 50)
return inner
@Decrator() # 类名后需加括号
def hello(name):
print(name)
hello("小明")
输出结果