• python 装饰器


    理解装饰器需要作用域、闭包的知识。

    函数作用域:

     从小的范围开始查找。例如现在函数体内查找,然后再到全局变量查找,最后再到内置函数查找。

    闭包函数示例:

    1 def get_number():
    2     x = 5              # x的作用域是get_number函数内
    3     def inner():       # inner是内部函数
    4         print (x)
    5     return (inner)     #返回内部函数名
    6 
    7 f = get_number()       #第一次调用get_number时,f得到的返回值是inner。
    8 f()                    #再次实例化f对象时和执行inner函数‘inner()’一样的。所以我们得到执行结果5.

    1、最基本的装饰器函数。

     1 #!/usr/bin/env python3
     2 import time
     3 
     4 def show_time(function_name):
     5     def inner():
     6         start_time = time.time()
     7         function_name()
     8         end_time = time.time()
     9         print ('run time is: {}'.format(end_time - start_time))
    10     return (inner)
    11 
    12 @show_time # 等同于test_func = show_time(test_func)
    13 def test_func():
    14     print ('test...')
    15     time.sleep(1)
    16 
    18 # 调用被装饰的函数test_func。
    19 test_func()

    2、给被装饰的功能函数加参数。

     1 import time
     2 
     3 def show_time(function_name):
     4     def inner(*x,**y):              #接收装饰器传过来的参数。
     5         start_time = time.time()
     6         function_name(*x,**y)       #接受功能函数的参数
     7         end_time = time.time()
     8         print ('run time is: {}'.format(end_time - start_time))
     9     return (inner)
    10 
    11 @show_time                          # 等同于test_func = show_time(test_func)
    12 def test_func(*a,**b):
    13     print (a)
    14     print (b)
    15     time.sleep(1)
    16 
    17 # 调用被装饰的函数test_func。
    18 test_func('e1','4f',str1='3',str3='test')

     3、给装饰器传参数

     1 import time
     2 def logger(flag):
     3     def show_time(function_name):
     4         def inner(*x,**y):             #接收装饰器传过来的参数。
     5             start_time = time.time()
     6             function_name(*x,**y)      #接受功能函数的参数
     7             end_time = time.time()
     8             print ('run time is: {}'.format(end_time - start_time))
     9             print ('from logger func: {}'.format(flag))
    10         return (inner)                 #返回内部功能函数的内存地址
    11     return (show_time)                 #返回装饰器函数的内存地址
    12 
    13 @logger('logger_test')                 # 等同于test_func = logger(test_func)
    14 def test_func(*a,**b):
    15     print (a)
    16     print (b)
    17     time.sleep(1)
    18 
    19 # 调用被装饰的函数test_func。
    20 test_func('e1','4f',str1='3',str3='test')
  • 相关阅读:
    oc kvc的模式:匹配搜索模式(模式匹配)、装包解包
    编程语言的多态与动态
    swift的@objc总结
    swift函数的调用约定
    PHP实现微信退款的分析与源码实现
    【MySQL】20个经典面试题,全部答对月薪10k+
    redis面试题总结
    【Redis缓存机制】1.Redis介绍和使用场景
    php四种文件加载语句
    做网站-mysql表字段设计
  • 原文地址:https://www.cnblogs.com/qikang/p/8622219.html
Copyright © 2020-2023  润新知