1、装饰器本质

装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

2、装饰器函数

假设要写一个输出函数执行时间的装饰器
def timer(func):
def inner():
start = time.time() #这里需要导入time模块
func()
end = time.time()
print(end - start) def func():
time.sleep(2) #延长函数的执行时间,方便观察
print('----') func = timer(func)
func()  #实质是已经变成了inner函数

3、语法糖

如果按2写,每次都要写func = timer(func),并且比较不方便,这时候可以使用@语法来进行装饰

#timer和func函数还是按照2中的
@timer
def func():... #@timer其实就是相当于执行了func = timer(func)

4、装饰有返回值的函数的装饰器

有时候函数是有返回值的,我们就可以这么做

def timer(func):
def inner():
start = time.time()
ret = func() #通过赋值给ret来接收func函数的返回值
end = time.time()
print(end-start)
return ret #因为装饰完的函数其实就是inner函数,所以通过inner的return,就可以将func函数的返回值返回回去
return inner @timer
def func():
time.sleep(1)
print('hahaha')
return 'oh,hsr' ret = func()

5、装饰带参数的函数的装饰器

#要装饰带有参数的函数,只要在内层函数中加上对应的参数就行
def timer(func):
def inner(args):
start = time.time()
func()
end = time.time()
print(args,end-start)
return inner @timer
def func(args):
time.sleep(1)
print('hahaha') func('aaa')

6、固定形式

# 在固定的形式中,我们使用带返回值的,并且不定参数

def wrapper(func):
def inner(*args,**kwargs): #这样就可以接收各种参数
#运行被装饰函数之前要做的事
ret = func(*args,**kwargs)
#运行被装饰函数之后要做的事
return ret
return inner

7、wraps

使用装饰器后,如果我们打印被装饰函数的__name__将会变成装饰器内层函数的名字

@wrapper
def func():
pass print(func.__name__) #打印inner 如果要让它变成的原来的,可以在内层函数的上方加上@wraps(func),需要导入functools模块 from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args,**kwargs): #这样就可以接收各种参数
#运行被装饰函数之前要做的事
ret = func(*args,**kwargs)
#运行被装饰函数之后要做的事
return ret
return inner

8、带参数的装饰器

如果要使用带参数的装饰器,可以在装饰器函数外面再套一层函数,并把要给装饰器的参数给最外层函数
def wrapper(flag):
def wrapper_inner(func):
@wraps(func)
def inner(*args,**kwargs): #这样就可以接收各种参数
#运行被装饰函数之前要做的事
ret = func(*args,**kwargs)
#运行被装饰函数之后要做的事
return ret
return inner @wrapper(FLAG)
def func():
pass

9、多个装饰器装饰一个函数

多个装饰器装饰一个函数的时候,会先从离函数最近的装饰器开始执行

def wrapper1(func):
def inner():
print("---1---")
func()
print("---1---")
return inner def wrapper2(func):
def inner():
print("---2---")
func()
print("---2---")
return inner @wrapper2
@wrapper1
def func():
print("func") func()
#结果
---2---
---1---
func
---1---
---2---

我们来看一下执行顺序

10、原则

开放封闭原则
开放:对扩展是开放的
封闭:对修改时封闭的

python基础8(装饰器)的更多相关文章

  1. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  2. 十. Python基础(10)--装饰器

    十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...

  3. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  4. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  5. 1.16 Python基础知识 - 装饰器初识

    Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位 ...

  6. python基础-----函数/装饰器

    函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 函数的优点之一是,可以将代码块与主程 ...

  7. python基础之装饰器(实例)

    1.必备 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  8. 【Python基础】装饰器的解释和用法

    装饰器的用法比较简单,但是理解装饰器的原理还是比较复杂的,考虑到接下来的爬虫框架中很多用到装饰器的地方,我们先来讲解一下. 函数 我们定义了一个函数,没有什么具体操作,只是返回一个固定值 请注意一下缩 ...

  9. 学习PYTHON之路, DAY 5 - PYTHON 基础 5 (装饰器,字符格式化,递归,迭代器,生成器)

    ---恢复内容开始--- 一 装饰器 1 单层装饰器 def outer(func): def inner(): print('long') func() print('after') return ...

  10. Python基础之装饰器

    1.什么是装饰器? Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然 ...

随机推荐

  1. 本地启动项目后cookie跨域获取不到的处理方式

    问题现象   最近在做Vue项目,很多时候调试代码需要本地访问localhost来进行,然而请求接口是通过代理实现的,那么就会存在一种情况是:代理域名下种植的cookie,在localhost域名下访 ...

  2. BZOJ 2820 luogu 2257 yy的gcd (莫比乌斯反演)

    题目大意:求$gcd(i,j)==k,i\in[1,n],j\in[1,m] ,k\in prime,n,m<=10^{7}$的有序数对个数,不超过10^{4}次询问 莫比乌斯反演入门题 为方便 ...

  3. vue通过路由实现页面刷新

    vue 开发微信商城项目,需求如下: 购物车页面跳转到详情页,购物车页面包含了多个组件,点击结算跳转到订单页面,从订单返回时,购物车页面没有刷新,由于购物车组件之间通过bus实现事件传递,页面跳转(非 ...

  4. ASP.NET-三种认证Authentication简介

    ASP.NET 的 认证Authentication主要分为三种 1.Form Authentication   用于互联网的认证,自定性强,功能强大,可以用cookie和ssl 2.Window A ...

  5. spring boot约定优于配置的这种做法在如今越来越流行了

    约定优于配置的这种做法在如今越来越流行了,它的特点是简单.快速.便捷.但是这是建立在程序员熟悉这些约定的前提上.而 Spring 拥有一个庞大的生态体系,刚开始转到 Spring Boot 完全舍弃 ...

  6. spring mvc常用知识点总结

    1.spring mvc是靠spring 启动的.通过springjar包的org.springframework.web.servlet.DispatcherServlet这个servlet类具体启 ...

  7. Linux内核中进程上下文和中断上下文的理解

    參考: http://www.embedu.org/Column/Column240.htm http://www.cnblogs.com/Anker/p/3269106.html 首先明白一个概念: ...

  8. ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...

  9. SSRS参数不能默认全选的解决方法

    解决方法选自<SQL Server 2008 R2 Reporting Services 报表服务>一书,亲测有效. 注意:参数默认值如果是字符串需要类型转换 =CStr("AL ...

  10. Android 自定义View 之利用ViewPager 实现画廊效果(滑动放大缩小)

    http://www.2cto.com/kf/201608/542107.html