zoukankan      html  css  js  c++  java
  • python装饰器

    了解一下什么是装饰器?

      装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是增加其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

    首先我们来看一下 Python 中的嵌套函数:

    def func1():
        print('now you are inside the hi()')
        def greet():
            return 'now you are in the gree()' 
    
        def welcome():
            return 'now you are in the welcome()'
    print(greet()) # 打印greet print(welcome()) # 打印greet func1() # 调用func1函数
    如果在程序中打印greet以及welcome时不加括号,程序输出的会是greet以及welcome函数的内存地址
    那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数。现在你需要再多学一点,就是函数也能返回函数。

    接着再尝试从函数中返回函数:
    def func1(name):
        def greet():
            return "now you are in the greet() function"
    def welcome(): return "now you are in the welcome() function"
    if name == "snake": return greet else: return welcome
    a = func1(name='snake') #实例化对象,并且给传入的参数赋一个值 print(a) # outputs: <function greet at 0x7f2143c01500> a`现在指向到func1()函数中的greet()函数 print(a()) # outputs: now you are in the greet() function
    • 再次看看这个代码。在 if/else 语句中我们返回 greet 和 welcome,而不是 greet() 和 welcome()。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它
    •  当我们写下 a = func1(),func1() 会被执行,而由于 name 参数默认是snake,所以函数 greet 被返回了。如果我们把语句改为 a =func1(name = "ali"),那么 welcome 函数将被返回。我们还可以打印出a(),这会输出 now you are in the greet() function

    装饰器的使用

    import time
    def timer(func):
        def inner():
            start=time.time()
            func()
            print(time.time()-start)
        return inner
    def func1():
        print('in func1')
        time.sleep(2)
    func1=timer(func1)
    func1()

    其实这样使用是比较麻烦的,接下来会使用一个python解释器自带的装饰函数

    现在我们使用@(python 解释器的装饰函数),试一下

    import time  # 导入time模块

    def timer(func): # 装饰函数
    def inner():
    start = time.time()
    func()
    print(time.time() - start)

    return inner # 不能加括号,否则就成了调用函数

    @timer
    def func1():
    print('in func1')
    time.sleep(2)

    # func1=timer(func1) #地址的一个改变
    func1() # 本质上调用的是inner

    装饰器实际上是个python函数,实现是由闭包支撑的

    应用场景:
    1,引入日志
    2,函数执行时间统计
    3,执行函数前预备处理
    4,执行函数后清理功能
    5,权限校验等场景
    6,缓存
    7,事务处理

  • 相关阅读:
    二叉查找中使用位运算符
    Python2021专业版激活码
    南邮计算机方向
    7.字符串、异常处理、文件和流(C++学习笔记)
    6.多态与抽象(C++学习笔记)
    5.对象类与继承(C++学习笔记)
    4.数组与指针(C++学习笔记)
    3.C++函数(C++学习笔记)
    2.C++控制语句(C++学习笔记)
    1.基本知识(C++学习笔记)
  • 原文地址:https://www.cnblogs.com/tisnk/p/11605864.html
Copyright © 2011-2022 走看看