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 相关文章推荐
Python3 正在毁灭 Python的原因分析
Nov 28 Python
Python下线程之间的共享和释放示例
May 04 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
python: line=f.readlines()消除line中\n的方法
Mar 19 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
django rest framework 过滤时间操作
Jul 12 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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
建立动态的WML站点(三)
2006/10/09 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
2013/06/24 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
js document.write()使用介绍
2014/02/21 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
jquery实现下拉框功能效果【实例代码】
2016/05/06 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
Python实现结构体代码实例
2020/02/10 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
企业办公室主任岗位职责
2014/02/19 职场文书
党员评议个人总结
2014/10/20 职场文书
董事会决议范本
2015/07/01 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
Python OpenCV之常用滤波器使用详解
2022/04/07 Python