zoukankan      html  css  js  c++  java
  • 装饰器概念&实际使用干货

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

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

    实际使用方式:

     1 #装饰器试验
     2 
     3 import time
     4 
     5 #装饰器
     6 def adron(fun):
     7     print('传入待装饰函数的内存地址:%s'%fun)
     8     def ad_x(*args,**kwargs):
     9         start_time = time.time()
    10         #fun+()的方式来执行被装饰函数
    11         fun(*args,**kwargs)
    12         stop_time = time.time()
    13         print('visit world use time:%s'%(stop_time-start_time))
    14     return ad_x
    15 
    16 #被装饰函数
    17 @adron # @adron = adron(tet),将tet内存地址传当做参数传入装饰器函数
    18 def tet():
    19     time.sleep(3)
    20     print('hello world!')
    21 #这里tet由装饰器装饰后,内存地址是ad_x的内存地址
    22 tet()
    23 
    24 @adron
    25 def jsq(n,s):
    26     for i in range(n):
    27         time.sleep(s)
    28         print(i)
    29 
    30 jsq(5,0.1)

    高阶装饰器:

     1 #大装饰器
     2 
     3 name = 'sober'
     4 password = '123'
     5 
     6 def badn(action):
     7     print("登录方式:%s"%action)
     8     #fun 由 @badn装饰器传入
     9     def bt_badn(fun):
    10         print('查看fun值:%s'%fun)
    11         def adron(*args,**kwargs):
    12             if action == 'local':
    13                 name_value = input('Please user name:')
    14                 password_value = input('Please Password:')
    15                 if name == name_value and password == password_value:
    16                     #fun 会执行被装饰函数,因为传入的fun是被执行函数的内存地址
    17                     ret_value = fun(*args,**kwargs)
    18                     print('装饰器内执行被装饰函数后返回前')
    19                     #返回被装饰函数执行后的结果
    20                     return ret_value
    21                 else:
    22                     print('username or password error')
    23             elif action == 'ldap':
    24                 print('ldap is unrealized')
    25         #return返回函数名称,是在返回函数内存地址,使用内存地址+()的方式调用函数
    26         return adron
    27     return  bt_badn
    28 
    29 
    30 def index():
    31     print('welcome !hello world!')
    32 
    33 @badn(action='local') # @badn = badn(home) 如果要传入参数则需要在装饰器函数内再嵌套一层
    34 def home():
    35     print('welcome home path')
    36     return 'a'
    37 
    38 @badn(action='ldap')
    39 def ldap():
    40     print('welcome ldap enter')
    41 
    42 index()
    43 #这里的执行通过函数内存地址+()执行函数
    44 #home()
    45 print('显示home返回值:%s'%home())
    46 ldap()

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

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

  • 相关阅读:
    记录使用cx_Freeze打包Python成exe可执行程序
    jquery plug-in DataTable API中文文档参考
    java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx/lib/arm/liblame.so: has text relocations
    CocoaPods的安装及使用
    Android 贝塞尔曲线的浅析
    GUI学习中错误Exception in thread "main" java.lang.NullPointerException
    线程
    12月13日
    今天开始学习java编程
    UVA10140 Prime Distance
  • 原文地址:https://www.cnblogs.com/shangmo/p/8471257.html
Copyright © 2011-2022 走看看