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编程中的反模式实例分析
Dec 08 Python
python 容器总结整理
Apr 04 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
Python unittest模块用法实例分析
May 25 Python
python使用tornado实现登录和登出
Jul 28 Python
Python列表生成式与生成器操作示例
Aug 01 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
Python File(文件) 方法整理
Feb 18 Python
numpy求平均值的维度设定的例子
Aug 24 Python
python读取hdfs并返回dataframe教程
Jun 05 Python
教你怎么用python实现字符串转日期
May 24 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Oct 16 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
PHP5 安装方法
2007/01/15 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
phpmail类发送邮件函数代码
2012/02/20 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
php实现文件预览功能
2017/05/23 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
JavaScript OOP类与继承
2009/11/15 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
Vue实现购物车场景下的应用
2017/11/27 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
python列表操作实例
2015/01/14 Python
python实现雨滴下落到地面效果
2018/06/21 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
python实现飞行棋游戏
2020/02/05 Python
python实现猜单词游戏
2020/05/22 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
蛋糕店创业计划书范文
2014/09/21 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
2014年化验员工作总结
2014/11/18 职场文书
会议开幕词
2015/01/28 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
元旦主持词开场白
2015/05/29 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript
Linux中各个目录的作用与内容
2022/06/28 Servers
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS