首页 > 编程语言 >【python】装饰器基础

【python】装饰器基础

时间:2022-10-24 22:34:54浏览次数:40  
标签:end python 基础 start time print foo 装饰 def

  • 什么是装饰器?
    • 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
  • 为何要用装饰器?
    • 开放封闭原则:
      • 开放:指的是对拓展功能是开放的
      • 封闭:指的是对修改源代码是封闭的
  • 装饰器基础知识
    • 作用域
    • 高阶函数:
      • 满足两个条件之一就叫高阶函数:
      • 1、函数名可以作为参数输入
      • 2、函数名可以作为返回值
    • 闭包:
      • 如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就认为是闭包
  • 如何用?
#在不改变foo函数及不改变调用方式的情况下,添加统计运行时间的功能
def foo():
    print('hello world!!!')
    time.sleep(2)
foo()

#解决方案一:失败,修改了源代码
import time
def foo():
    start = time.time()
    print('hello world!!!')
    time.sleep(2)
    end = time.time()
    print(end - start)
foo()

#解决方案二:失败,修改了调用方式
import time
def foo():
    start = time.time()
    print('hello world!!!')
    time.sleep(2)
    end = time.time()
    print(end - start)

def show_time():
    start = time.time()
    foo()
    end = time.time()
    print(end - start)
show_time()

#解决方案三:失败,将show_time函数做的跟装饰一样,以假乱真。但是每次都需要重新赋值
import time
def show_time(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print('speed %s'%(end-start))
    return inner


def foo():
    print('hello world!!!')
    time.sleep(2)

foo = show_time(foo)   #foo指向show_time函数的内存地址
foo()

#解决方案四:语法糖
import time
def show_time(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print('speed %s'%(end-start))
    return inner

@show_time    #foo = show_time(foo)
def foo():
    print('hello world!!!')
    time.sleep(2)
foo()

标签:end,python,基础,start,time,print,foo,装饰,def
From: https://www.cnblogs.com/xwltest/p/16823291.html

相关文章

  • 基础I/O
    在c中的对文件进行操作1#include<stdio.h>2#include<unistd.h>34intmain(intargc,char*argv[])5{6if(argc!=2)7{8printf("Us......
  • Netty介绍、BIO与NIO基础知识
    第1章Netty介绍和应用场景1.1Netty介绍Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty是一个异步的、基于事件驱动的网络应用框架,用以快速开......
  • 学习笔记:python公约数和公倍数
    python学习题目:输出两个数的最大公约数和最小公倍数,解题思路先将较大的数和较小的数求出来创建一个空列表然后对小的数做循环找两个数的公因数加入空列表中在用max......
  • Python 中3.6及之前版本datetime没有fromisoformat()的解决方法
    Python中可以使用datetime的fromisoformat()方法将字符串转成datetime对象,但只有Python3.7以上才支持,Python3.6及之前的版本不支持,调用会报错:AttributeError:typeobje......
  • python -c 执行单行命令或脚本
    python-c执行单行命令或脚本背景:最新在编写shell脚本实现数据库的自动巡检功能,在某些巡检项需要处理json类型的数据。使用不擅长处理字符串的shell来处理json,各......
  • Python教程Day12-函数(一)
    函数(一)一、函数的作用​​需求​​:用户到ATM机取钱输入密码后显示"选择功能"界面查询余额后显示"选择功能"界面取2000钱后显示"选择功能"界面特点:显示“选择功能”界面需要......
  • Python教程Day12-函数(二)
    函数(二)一、变量作用域一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量作用域指的是变量生效的范围,主要分为两类:局部变量......
  • 【2022.10.24】Vue基础学习(1)
    内容概要1.前端发展介绍2.Vue的快速使用3.差值语法4.指令系统之文本指令5.指令系统之事件指令6.指令系统之属性指令内容详细1前端发展介绍#HTML(5)、CSS(......
  • 计算机基础(一)
    1、什么是计算机?计算机(Computer)俗称电脑,是一种高速计算的电子机器,计算机可以进行数值运算、逻辑判断,能够接收和储存信息数据(文本、图片、音频、视频等),还可以按照储存在......
  • python之第三方库netifaces库:netifaces 模块用于提供有关网络接口及其状态的信息(①获
    前言1、 在系统运维等过程中,网络永远是离不开的话题。网络中比较基础的是网络接口,每个网络接口都有一个名字,并且有它的ip地址,还有关于从这个接口出去的包的路由。我们可......