定义:
  • 本质是函数(装饰其他函数),是为其他函数添加附加功能
原则:
  • 不能修改被装饰函数的源代码
  • 不能修改被装饰函数的调用方式
 
实现装饰器知识储备:
  • 函数及“变量”
  • 高阶函数
  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. struts1 & jquery form 文件异步上传

    1.概述 还在用struts1?是的,在地球的没写地方,落后的生产方式还在运转(老项目). 从 继承org.apache.struts.action.Action, 继承org.apache.stru ...

  2. 优秀iOS文章集合

    Runtime 10种用法(没有比这更全的了成为iOS顶尖高手,你必须来这里(这里有最好的开源项目和文章)iOS逆向Reveal查看任意app 的界面JSPatch (实时修复App Store bu ...

  3. JS是单线程的吗?

    Javascript是单线程的深入分析 首先一个引子:为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的? 先看例子1: functio ...

  4. java 从网上下载文件的几种方式

    package com.github.pandafang.tool; import java.io.BufferedOutputStream; import java.io.File; import ...

  5. 通过JavaScript创建Qml对象

    有两种方法可以创建,都是全局对象Qt提供的方法 一:用Qt.createComponent加载一个qml文件并创建Component 二:用Qt.createQmlObject从一个qml字符串创建C ...

  6. 【Leetcode】【Medium】Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  7. mysqldump导出sql文件中insert多行问题

    mysqldump为了加快导入导出,默认把数据都缩减在一行里面. 查看和修改不方便,为此,我们可以使用--skip-extended-insert选项来使导出的数据,是多行插入形式的. mysqldu ...

  8. IE Edge 下载文件的时候,文件名不能有windows不支持的特殊字符

    IE Edge 下载文件的时候,文件名不能有windows不支持的特殊字符,比如:等. 马了个批的,其他浏览器包括IE就可以自动转换,比如:会自动变为_.

  9. easyui学习笔记4—panel的实现

    这篇看看easyui是怎么实现panel的,就是类似一个容器,里面可以装具体内容或者其他的easyui控件. 1.这里先看看引用的资源文件 <link rel="stylesheet& ...

  10. APUE1.11:系统调用 库函数

    区别是: system call:提供一种最小接口,而库函数通常提供比较复杂的功能.