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 相关文章推荐
python根据京东商品url获取产品价格
Aug 09 Python
Python进行数据提取的方法总结
Aug 22 Python
python递归查询菜单并转换成json实例
Mar 27 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
python让列表倒序输出的实例
Jun 25 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
如何用PyPy让你的Python代码运行得更快
Dec 02 Python
Python中的程序流程控制语句
Feb 24 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
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
单利模式及python实现方式详解
2018/03/20 Python
python DataFrame 取差集实例
2019/01/30 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
教师学习三严三实心得体会
2014/10/13 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
实习感想范文
2015/08/10 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
Python实现byte转integer
2021/06/03 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
MySQL sql模式设置引起的问题
2022/05/15 MySQL