定义:
  • 本质是函数(装饰其他函数),是为其他函数添加附加功能
原则:
  • 不能修改被装饰函数的源代码
  • 不能修改被装饰函数的调用方式
 
实现装饰器知识储备:
  • 函数及“变量”
  • 高阶函数
  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. 微信小程序中使用wxParse展示HTML内容

    wxParse的GitHub地址:https://github.com/icindy/wxParse 一.数据内容: 请求地址:https://m.quanchepin.com/index.php?a ...

  2. Web前端面试指导(十七):一个满屏 品 字布局 如何设计?

    题目点评 这道题目有可能是笔试题,有可能面谈的时候进行叙述,如果是笔试题要求对css样式代码非常熟练,如果是面谈叙述,就需要你的表达能力非常强,要抓住要点,把需要用到的技能点讲清楚就可以了. 需要用到 ...

  3. 项目经验:GIS<MapWinGIS>建模第三天

    记录下GIS工程进展

  4. C# textBox限定输入数字

    private void tBox_KeyPress(object sender, KeyPressEventArgs e) { ; //禁止空格键 )) return; //处理负数 if (e.K ...

  5. Element和vue框架报错提示

    上面报错提示Error in render function: "TypeError:Cannot read property '$options' of undefined" 就 ...

  6. c# 依赖注入之---反射(转)

    详细请看http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 定义一个接口,和两个类(实现该接口) IButton: using ...

  7. Virtualenv-windows

    1.下载 pip3 install virtualenv 2.创建虚拟化环境 3. 进入虚拟化目录 4.推出虚拟化环境 5.指定python版本 二.virtualenvwrapper的使用 1.下载 ...

  8. 华为手机在开发Android调试时logcat不显示输出信息的解决办法

    手机连接电脑RUN AS logcat 提示:Unable to open log device '/dev/log/main': No such file or directory 信息 本人华为C ...

  9. Java不带.classpath的svn项目下载,转成到eclipse中

    .classpath是Eclipse的工程文件,别人没有将工程的信息传到SVN库中,就检查不出.classpath文件,识别不了项目结构. 这种做法也是比较提倡的方法.SVN上只要有项目的源码信息就可 ...

  10. Struts学习-Hibernate

    Hibernate (开放源代码的对象关系映射框架) http://www.cnblogs.com/wenwen123/p/5658625.html 一. 1.新建 2.配置 <!-- hibe ...