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中的MongoDB基本操作:连接、查询实例
Feb 13 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
python图书管理系统
Apr 05 Python
django ajax json的实例代码
May 29 Python
对Python函数设计规范详解
Jul 19 Python
Python 过滤错误log并导出的实例
Dec 26 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
python 浮点数四舍五入需要注意的地方
Aug 18 Python
使用pytorch实现线性回归
Apr 11 Python
用Python提取PDF表格的方法
Apr 11 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
用PHP+MySql编写聊天室
2006/10/09 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php比较多维数组中值的大小排序实现代码
2012/09/08 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
php时间戳转换代码详解
2019/08/04 PHP
javascript 禁止复制网页
2009/06/11 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
详解Vue中过度动画效果应用
2017/05/25 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python制作简易注册登录系统
2016/12/15 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
基于树莓派的语音对话机器人
2019/06/17 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
Python学习之time模块的基本使用
2021/01/17 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
农民工创业典型事迹
2014/01/25 职场文书
演讲稿格式
2014/04/30 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
redis复制有可能碰到的问题汇总
2022/04/03 Redis