定义:
  • 本质是函数(装饰其他函数),是为其他函数添加附加功能
原则:
  • 不能修改被装饰函数的源代码
  • 不能修改被装饰函数的调用方式
 
实现装饰器知识储备:
  • 函数及“变量”
  • 高阶函数
  1. 把一个函数名当做实参传给另外一个函数(不修改被装饰函数,为其添加功能)
  2. 返回值中包含函数名(不修改函数调用方式)用return返回内存地址
  • 嵌套函数

装饰器 = 高阶函数 + 嵌套函数

实际使用方式:

 #装饰器试验

 import time

 #装饰器
def adron(fun):
print('传入待装饰函数的内存地址:%s'%fun)
def ad_x(*args,**kwargs):
start_time = time.time()
#fun+()的方式来执行被装饰函数
fun(*args,**kwargs)
stop_time = time.time()
print('visit world use time:%s'%(stop_time-start_time))
return ad_x #被装饰函数
@adron # @adron = adron(tet),将tet内存地址传当做参数传入装饰器函数
def tet():
time.sleep(3)
print('hello world!')
#这里tet由装饰器装饰后,内存地址是ad_x的内存地址
tet() @adron
def jsq(n,s):
for i in range(n):
time.sleep(s)
print(i) jsq(5,0.1)

高阶装饰器:

 #大装饰器

 name = 'sober'
password = '' def badn(action):
print("登录方式:%s"%action)
#fun 由 @badn装饰器传入
def bt_badn(fun):
print('查看fun值:%s'%fun)
def adron(*args,**kwargs):
if action == 'local':
name_value = input('Please user name:')
password_value = input('Please Password:')
if name == name_value and password == password_value:
#fun 会执行被装饰函数,因为传入的fun是被执行函数的内存地址
ret_value = fun(*args,**kwargs)
print('装饰器内执行被装饰函数后返回前')
#返回被装饰函数执行后的结果
return ret_value
else:
print('username or password error')
elif action == 'ldap':
print('ldap is unrealized')
#return返回函数名称,是在返回函数内存地址,使用内存地址+()的方式调用函数
return adron
return bt_badn def index():
print('welcome !hello world!') @badn(action='local') # @badn = badn(home) 如果要传入参数则需要在装饰器函数内再嵌套一层
def home():
print('welcome home path')
return 'a' @badn(action='ldap')
def ldap():
print('welcome ldap enter') index()
#这里的执行通过函数内存地址+()执行函数
#home()
print('显示home返回值:%s'%home())
ldap()

注:学习oldboy python自动化运维——装饰器篇笔记

代码内加入了本人对装饰使用的理解

装饰器概念&实际使用干货的更多相关文章

  1. 洗礼灵魂,修炼python(29)--装饰器(1)—>利用经典案例解析装饰器概念

    前提必备 不急着进入正题,在前面函数作用域那一章介绍了闭包,全局变量局部变量,这里再看几个简单的闭包案例: 1):不带参数 注意: 1.这里的name属性是每个函数都有的,可以反馈函数名 2.temp ...

  2. python装饰器概念与应用

    格式一:装饰器外层不传参,内层传参 user_status = False # 用户登录了就把这个改成True def login(func): # 把要执行的henan模块从这里传进来 def in ...

  3. python学习Day13 函数的嵌套定义、global、nonlocal关键字、闭包及闭包的运用场景、装饰器

    复习 1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => fn的返回值 ...

  4. python 闭包和装饰器

    python 闭包和装饰器 一.闭包闭包:外部函数FunOut()里面包含一个内部函数FunIn(),并且外部函数返回内部函数的对象FunIn,内部函数存在对外部函数的变量的引用.那么这个内部函数Fu ...

  5. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  6. Python学习之路day4-函数高级特性、装饰器

    一.预备知识 学习装饰器需理解以下预备知识: 函数即变量 函数本质上也是一种变量,函数名即变量名,函数体就变量对应的值:函数体可以作为值赋给其他变量(函数),也可以通过函数名来直接调用函数.调用符号即 ...

  7. Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

    一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = la ...

  8. python基础-闭包函数和装饰器

    闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...

  9. 装饰器&偏函数与作用域与异常处理与文件读写

    装饰器 概念:是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 简单的装饰器 def func1(): print("sunck is a good man& ...

随机推荐

  1. 盒模型的属性丶display显示丶浮动

    一丶盒模型的属性(重要) 1.padding padding是标准文档流,父子之间调整位置 <!DOCTYPE html> <html> <head> <me ...

  2. 如何解决织梦DedeCMS后台模块管理列表不显示

    在使用织梦Dedecms的过程中,我们会遇到模块管理列表无法显示的问题,造成织梦模块管理列表无法显示的原因,可能有很多种,现小编总结了遇到过的一种方法仅供参考. 方法步骤一: 由于/data/modu ...

  3. 如何开发一个Servlet

    1 如何开发一个Servlet 1.1 步骤: 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 s ...

  4. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    原文:http://www.cnblogs.com/JCSU/articles/1305401.html C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. ...

  5. anroid之异步不如异步

    executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 使用自定义的CorePoolSize为7的Executor(Executors.newFixedTh ...

  6. csdn中使用Git的一些注意问题

    1.生成的密钥必须在当前用户文档目录下的.ssh文件夹.----否则不行 2.生成的密钥文件命名---必须命名为id_ras文件----否则不行

  7. C++中protected的访问权限

    关于C++中protected的访问权限的讨论已经是一个很陈旧的话题了,陈旧到大家都不愿意去讨论,觉得他见到到吃饭睡觉那么自然. 我再次读<C++ Primer>的时候,其中关于prote ...

  8. pt-deadlock-logger使用

    死锁监控pt-deadlock-logger 首先我们要创建一个表用来保存死锁的信息: CREATE TABLE deadlocks ( server ) NOT NULL, ts timestamp ...

  9. 使用CoreImage教程

    使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image ...

  10. zookeeper 的监控工具

    zookeeper 的监控工具         公司很多产品会使用zookeeper,比如Meta消息中间件,在测试的过程中,我们经常需要查询zookeeper里面的信息来精确定位问题.目前项目中有开 ...