装饰器之我见

  python里的装饰器到底是个什么东东,初看起来,可能有的小伙伴会发懵啊,哈哈。

  先来个装饰器的例子瞅瞅:

   

  Author:RYB
# __*__coding:utf-8__*__ '''
dec函数通过用户名和密码实现验证功能。
'''
def dec(func):
def auth():
username = "ryb"
password = ""
user = input("username:").strip()
passwd = input("password:").strip()
if user == username and passwd == password:
msg = print("验证通过,欢迎来到京东商城!")
elif user == username and passwd != password:
msg = print("密码不正确,请输入正确的密码!")
elif user != username and passwd != password:
msg = print("用户名和密码均不正确,请输入正确的用户名和密码!")
else:
msg = print("用户名不正确,请输入正确的用户名!")
return auth #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
@dec
def jd():
print("welcome to jd!") #执行jd函数
jd()

 上面装饰器例子(函数版):可读性更强一些哈哈

    

 # Author:RYB
# __*__coding:utf-8__*__ #用户名和密码都正确
def user_passd_right():
msg = print("验证通过,欢迎来到京东商城!") #用户名正确,密码不正确
def useright_passd():
print("密码不正确,请输入正确的密码!") #用户不正确,密码正确
def user_passdright():
print("用户名不正确,请输入正确的用户名!") #用户名和密码都不正确
def user_passd():
print("用户名和密码均不正确,请输入正确的用户名和密码!") '''
dec函数通过用户名和密码实现验证功能。
'''
def dec(func):
def auth():
username = "ryb"
password = ""
user = input("username:").strip()
passwd = input("password:").strip()
if user == username and passwd == password:
user_passd_right()
func()
elif user == username and passwd != password:
useright_passd()
elif user != username and passwd != password:
user_passd()
else:
user_passdright()
return auth #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
@dec
def jd():
print("welcome to jd!") #执行jd函数
jd()

    

那么到底装饰器是个什么东西呢?我想,通过上面的例子说的通俗一些,伙伴们多少知道一些吧。装饰器其实也是一个函数,一个用来包装函数的函数,装饰即修饰,意指为其他函数添加新功能。

  装饰器定义:本质就是函数,功能是为其他函数添加新功能

  装饰器需要遵循的原则:

    1.不修改被装饰函数的源代码(开放封闭原则);

    2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

  装饰器知识储备:装饰器=高阶函数+函数嵌套+闭包

  装饰器的例子1:

    

 # Author:RYB
# __*__coding:utf-8__*__
import time def timer(func):
def wrapper():
start_time = time.time()
func()
stop_time = time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#@timer等价index=timer(index)
@timer
def index():
print("in the index")
index()

运行结果如下:  

  in the index
  run time is 0.0

  装饰器的例子2:有参数的

    

 # Author:RYB
# __*__coding:utf-8__*__ import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper #@timer等价index=timer(index)
@timer
def index(msg):
print("in the index:",msg)
return 1
res=index("hello myworld")
print(res)

运行结果:  

  in the index: hello myworld
  run time is 0.0
  1

最新文章

  1. Maven设置代理服务器
  2. [转] 国内外最全面和主流的JS框架与WEB UI库(强烈推荐)
  3. ABAP Util代码
  4. InternetOpen怎么使用代理
  5. Away3D 的实体收集器流程2
  6. 利用GDataXML解析XML文件
  7. Android Sqlite数据库执行插入查询更新删除的操作对比
  8. Webapi文档描述-swagger优化
  9. SAP高可用性(HA)
  10. Docker 使用教程
  11. C#:TextBox数据绑定
  12. Hadoop记录-Federation联邦机制
  13. 20165215 实验三 敏捷开发与XP实践
  14. Android 深入浅出 - manifest文件的使用
  15. .Net中使用ODP.net访问Oracle数据库
  16. js文字转语音并播放
  17. windows 中安装及使用 SSH Key
  18. Fzu软工第二次作业-词频分析
  19. WebAPI 抛出HttpResponseException异常
  20. VUE组件相关总结!

热门文章

  1. Webpack 配置摘要
  2. 如何用easyui+JAVA 实现动态拼凑datagrid表格(续)
  3. EmguCV 简单图形绘制
  4. nodeJs开发app.js解析
  5. 给定金额m和红包数量n
  6. Win8.1系统下安装nodeJS
  7. android可拖动排序GridView实现
  8. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第五章:排序、分页和路由
  9. 【第一篇】Volley的使用之json请求
  10. 在Swift中实现 oc与swift的混编
  11. php对数组进行分页
  12. 离线搭建Android Studio开发环境
  13. python 初级重点
  14. Oracle高效分页查询(转)
  15. maven jar 怎么看jdk编译版本
  16. Outdated Kotlin Runtime
  17. python3和pip3安装和问题解决
  18. Visual Studio使用阿里云Code Git服务器的常见问题
  19. VS2008兼容安装
  20. 学习C#基础知识这段时间