Python新手学习装饰器


Posted in Python onJune 04, 2020

python函数式编程之装饰器

1.开放封闭原则

简单来说,就是对扩展开放,对修改封闭。

在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。

此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。

2.什么是装饰器

装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。

所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。

3.装饰器的作用

在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。

原则:

1.不修改被装饰对象的源代码

2.不修改被装饰对象的调用方式

目标:

为被装饰对象添加新功能。

实例扩展:

import time
# 装饰器函数
def wrapper(func):
 def done(*args,**kwargs):
  start_time = time.time()
  func(*args,**kwargs)
  stop_time = time.time()
  print('the func run time is %s' % (stop_time - start_time))
 return done
# 被装饰函数1
@wrapper
def test1():
 time.sleep(1)
 print("in the test1")
# 被装饰函数2
@wrapper
def test2(name): #1.test2===>wrapper(test2) 2.test2(name)==dome(name)
 time.sleep(2)
 print("in the test2,the arg is %s"%name)
# 调用
test1()
test2("Hello World")

不含参数实例:

import time
user,passwd = 'admin','admin'
def auth(auth_type):
 print("auth func:",auth_type)
 def outer_wrapper(func):
  def wrapper(*args, **kwargs):
   print("wrapper func args:", *args, **kwargs)
   if auth_type == "local":
    username = input("Username:").strip()
    password = input("Password:").strip()
    if user == username and passwd == password:
     print("\033[32;1mUser has passed authentication\033[0m")
     res = func(*args, **kwargs) # from home
     print("---after authenticaion ")
     return res
    else:
     exit("\033[31;1mInvalid username or password\033[0m")
   elif auth_type == "ldap":
    print("ldap链接")
  return wrapper
 return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
 print("welcome to home page")
 return "from home"
@auth(auth_type="ldap")
def bbs():
 print("welcome to bbs page"
print(home()) #wrapper()
bbs()

到此这篇关于Python新手学习装饰器的文章就介绍到这了,更多相关Python之装饰器简介内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
定制FileField中的上传文件名称实例
Aug 23 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
Python数据结构之哈夫曼树定义与使用方法示例
Apr 22 Python
Python实现获取邮箱内容并解析的方法示例
Jun 16 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
如何定义TensorFlow输入节点
Jan 23 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python 自由定制表格的实现示例
Mar 20 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
Python 可迭代对象 iterable的具体使用
Aug 07 Python
基于python 取余问题(%)详解
Jun 03 #Python
Python中关于logging模块的学习笔记
Jun 03 #Python
Python学习之os模块及用法
Jun 03 #Python
Python爬虫HTPP请求方法有哪些
Jun 03 #Python
什么是Python变量作用域
Jun 03 #Python
Python Flask框架实现简单加法工具过程解析
Jun 03 #Python
python自定义函数def的应用详解
Jun 03 #Python
You might like
php 无限级缓存的类的扩展
2009/03/16 PHP
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
php 求质素(素数) 的实现代码
2011/04/12 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
JavaScript 无符号右移运算符
2009/04/17 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
python3 字符串知识点学习笔记
2020/02/08 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
学生党员思想汇报
2013/12/28 职场文书
乡镇爱国卫生月活动总结
2014/06/25 职场文书
烟台的海导游词
2015/02/02 职场文书
初中数学教学随笔
2015/08/15 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android