python闭包装饰器
Posted Guan_zi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python闭包装饰器相关的知识,希望对你有一定的参考价值。
内部函数
闭包:
闭包将内部函数自己的代码和作用域以及外部函数的作用结合起来。
闭包的词法变量不属于全局名字空间域或者局部的——而是属于其他的名字空间,带着流浪的作用域。
闭包对于安装计算,隐藏状态,以及在函数对象和作用域中随意的切换是很有用的。
闭包也是函数,但是他们能携带一些额外的作用域。
实例
装饰器
装饰器是在函数调用之上的修饰
这些修饰是当声明一个函数或者方法的时候,才会应用的额外调用
使用装饰器的情形有:
——引用日志
——增加计时逻辑来检测性能
——给函数加入事物的能力
装饰器实例1:设置验证函数,登录前调用登录验证函数
user_status = False #用户登录后就改变状态为True user_status = False
#用户登录后就改变状态为True
def login():
username = \'zhangsan\'
password = \'abc123\'
global user_status
if user_status == False:
username1 = input(\'请输入用户名:\')
password1 = input(\'请输入密码:\')
if username==username1 and password==password1:
user_status = True
print(\'用户登录成功!\')
else:
print(\'用户名或密码错误!\')
else:
print(\'用户已登录,验证通过……\')
def home():
print(\'首页\'.center(20,\'-\'))
def america():
if login():#执行前加上验证
print(\'欧美专区\'.center(20,\'-\'))
def japan():
login()#执行前验证
print(\'日韩专区\'.center(20,\'-\'))
home()
america()
装饰器实例2:
编程原则:
封闭:已实现的功能代码块不应该被修改
开放:兑现有功能的扩展开放
user_status = False #用户登录后就改变状态为True def login(func): username = \'zhangsan\' password = \'abc123\' global user_status if user_status == False: username1 = input(\'请输入用户名:\') password1 = input(\'请输入密码:\') if username==username1 and password==password1: user_status = True print(\'用户登录成功!\') else: print(\'用户名或密码错误!\') elif user_status == True: func() def home(): print(\'首页\'.center(20,\'-\')) def america(): print(\'欧美专区\'.center(20,\'-\')) def japan(): print(\'日韩专区\'.center(20,\'-\')) home() login(america) login(japan)
装饰器实例3
def login(func): def inner(): username = \'zhangsan\' password = \'abc123\' global user_status if user_status == False: username1 = input(\'请输入用户名:\') password1 = input(\'请输入密码:\') if username==username1 and password==password1: user_status = True print(\'用户登录成功!\') else: print(\'用户名或密码错误!\') if user_status == True: func() #如果验证通过,就能调用相应的功能 return inner def home(): print(\'首页\'.center(20,\'-\')) def america(): print(\'欧美专区\'.center(20,\'-\')) @login def japan(): print(\'日韩专区\'.center(20,\'-\')) home() japan()
装饰器实例4 :带参数的函数
user_status = False #用户登录后就改变状态为True def login(func): def inner(*args, **kwargs): username = \'zhangsan\' password = \'abc123\' global user_status if user_status == False: username1 = input(\'请输入用户名:\') password1 = input(\'请输入密码:\') if username==username1 and password==password1: user_status = True print(\'用户登录成功!\') else: print(\'用户名或密码错误!\') if user_status == True: func(*args, **kwargs) #如果验证通过,就能调用相应的功能 return inner def home(): print(\'首页\'.center(20,\'-\')) @login def america(): print(\'欧美专区\'.center(20,\'-\')) @login def japan(style):#带参数 print(\'日韩专区\'.center(20,\'-\')) home() japan(\'3p\')#调用必须传参 america()
装饰器4:增加验证方法,多层嵌套
user_status = False #用户登录后就改变状态为True def login(auth_type): def auth(func):#把要执行的模块从这里传进来 def inner(*args, **kwargs): if auth_type==\'qq\': username = \'zhangsan\' password = \'abc123\' global user_status if user_status == False: username1 = input(\'请输入用户名:\') password1 = input(\'请输入密码:\') if username==username1 and password==password1: user_status = True print(\'用户登录成功!\') else: print(\'用户名或密码错误!\') if user_status == True: return func(*args, **kwargs) #如果验证通过,就能调用相应的功能 else: print(\'only support qq\') return inner return auth def home(): print(\'首页\'.center(20,\'-\')) @login(\'qq\') def america(): print(\'欧美专区\'.center(20,\'-\')) @login(\'weibo\') def japan(style):#带参数 print(\'日韩专区\'.center(20,\'-\')) home() japan(\'3p\')#调用必须传参 america()
以上是关于python闭包装饰器的主要内容,如果未能解决你的问题,请参考以下文章