博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器
阅读量:4344 次
发布时间:2019-06-07

本文共 1873 字,大约阅读时间需要 6 分钟。

装饰器

什么是装饰器

装饰器是用来给某个功能添加新功能的工具。

装饰器本身可以是任意可调用的对象,被装饰的对象也可以是任意可调用的对象。

为何要用装饰器

想要在不修改功能源代码以及调用方式的前提下为原功能添加新功能。

装饰器是闭包函数的应用

闭包函数=函数对象+函数嵌套定义+作用域
闭包函数指的是定义在函数内部的函数,并且该内部函数包含对外层函数作用域名称的引用。
闭包函数

import timedef index():    print('welcome to index page')    time.sleep(3)    return 'something'def outter(func):    def wrapper():        start=time.time()        res=func()        end=time.time()        print(' process run time is %s' %(end-start))        return res    return wrapperindex=outter(index)res = index()print(res)

无参装饰器

编写一个计算程序运行时间的装饰器

import time@outterdef index(name):    print('from %s'%name)    time.sleep(2)    def outter(func):    def wrapper(*args,**kwargs):        start=time.time()        func(*args,**kwargs)        end=time.time()        print('run time is %s'%(end-start))    return wrapperindex()

无参数装饰器模板

def outter(func):    def wrapper(*args,**kwargs):        res=func(*args,**kwargs)        return res    return wrapper

有参装饰器

import timelogin_userinfo = {'userinfo': None}def outter(name='zz'):    def auth(func):        def wrapper(*args, **kwargs):            if login_userinfo['userinfo'] is not None:                res = func(*args, **kwargs)            input_user = input('username>>>')            input_passwd = input('password>>>')            if input_user == name and input_passwd == 'abc':                print('login successful')                login_userinfo['userinfo'] = input_user                res = func(*args, **kwargs)            return res        return wrapper    return auth@outter(name='szz')def index(name):    print('this is %s' % name)    time.sleep(2)    return 'something'print(index('index'))

装饰器的用途就是为了在不改变源代码的基础上添加新的功能,或者需要接收新的变量,要么直接传值给函数,要么运用闭包的原理,内层函数可以对外层函数作用域的引用,把要传的值用函数包起来传下去。

global与nonlocal

global关键字的用途是把局部变量声明为全局变量,可以在函数内部修改全局变量

nonlocal关键字是把局部变量声明为上一层的作用域

转载于:https://www.cnblogs.com/zuanzuan/p/9713721.html

你可能感兴趣的文章
阶段3 3.SpringMVC·_07.SSM整合案例_08.ssm整合之Spring整合MyBatis框架
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_12、SpringBoot2.x文件上传实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_20、SpringBoot2.x配置全局异常实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_23、SpringBoot2.x启动原理概述...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_21、SpringBoot2.x配置全局异常返回自定义页面...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_32..SpringBoot2.x持久化数据方式介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_34、SpringBoot整合Mybatis实操和打印SQL语句...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_35、事务介绍和常见的隔离级别,传播行为...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_42、SpringBoot常用定时任务配置实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第14节 高级篇幅之SpringBoot多环境配置_59、SpringBoot多环境配置介绍和项目实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_41、SpringBoot定时任务schedule讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_43、SpringBoot2.x异步任务实战(核心知识)...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战...
查看>>