python装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4366字,纯文字阅读大概需要7分钟。
内容图文
![python装饰器](/upload/InfoBanner/zyjiaocheng/845/deb912c5d8ef49cab9e29f41163c533e.jpg)
闭包:
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
def outer(): name = 'alex' def inner(): print("在inner里打印外层函数的变量",name) return inner f = outer() f()
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
装饰器:
一个装饰器(decorator)只是一个带有一个函数作为参数并返回一个函数的闭包
装饰器的作用就是为已经存在的函数或对象添加额外的功能
例一:
不加参数的装饰器:
# _*_coding:utf-8_*_ user_status = False #用户登录了就把这个改成True def login(func): #把要执行的模块从这里传进来 def inner():#再定义一层函数 _username = "alex" #假装这是DB里存的用户信息 _password = "abc!23" #假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: func() # 看这里看这里,只要验证通过了,就调用相应功能 return inner # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 @login #america = login(america) def america(): #login() #执行前加上验证 print("----欧美专区----") def japan(): print("----日韩专区----") @login def henan(): #login() #执行前加上验证 print("----河南专区----") henan() 例二:
带参数的装饰器:
# _*_coding:utf-8_*_ user_status = True #用户登录了就把这个改成True def login(auth_type): #把要执行的模块从这里传进来 def auth(func): def inner(*args, **kwargs):#再定义一层函数 if auth_type == "qq": _username = "alex" #假装这是DB里存的用户信息 _password = "abc!23" #假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 else: print("only support qq ") return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 return auth def home(): print("---首页----") @login('qq') def america(style): #login() #执行前加上验证 print("----欧美专区----") def japan(style): print("----日韩专区----") @login('qq') ## henan = login('qq')(henan('3p')) def henan(style): ''' :param style: 喜欢看什么类型的,就传进来 :return: ''' #login() #执行前加上验证 print("----河南专区----") home() # #那用户调用时依然写 america('3p') henan('3p')
例三:
计算函数运行时间的装饰器:
# _*_coding:utf-8_*_ import string, random,time,datetime def count_time(type): def inner(): start = datetime.datetime.now() # time.sleep(2) # print(random.sample(string.ascii_letters + string.digits, 6)) obj = type() end = datetime.datetime.now() print(end - start) return obj return inner @count_time def rand(): print(random.sample(string.ascii_letters + string.digits, 6)) time.sleep(5) rand() 输出: ['X', 'm', 'r', '7', 'l', 'D'] 0:00:05.000630
例四:
import time,random,string def count_time(type): def inner(*args, **kwargs): start = time.time() L = type(*args, **kwargs) end = time.time() print('程序运行时间%s秒' % (end - start)) return L return inner @count_time def string_create(): print(random.sample(string.digits + string.ascii_letters, 6)) time.sleep(3) string_create() 输出: ['O', 'y', 'R', 'V', 'u', '3'] 程序运行时间3.000283718109131秒
内容总结
以上是互联网集市为您收集整理的python装饰器全部内容,希望文章能够帮你解决python装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。