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中装饰器的一个妙用
Feb 08 Python
介绍Python中几个常用的类方法
Apr 08 Python
粗略分析Python中的内存泄漏
Apr 23 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
python实现人脸识别代码
Nov 08 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 Python
一起来学习Python的元组和列表
Mar 13 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
mysql 搜索之简单应用
2007/04/27 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
毕业生多媒体设计求职信
2013/10/12 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
经验丰富大学生村干部自我鉴定
2014/01/22 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
安全口号大全
2014/06/21 职场文书
商务经理岗位职责
2014/07/30 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
小程序实现文字循环滚动动画
2021/06/14 Javascript
MongoDB数据库的安装步骤
2021/06/18 MongoDB
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python