python函数-装饰器

1.装饰器的原则--开放封闭原则

开放:对于添加新功能是开放的

封闭:对于修改原功能是封闭的

2.装饰器的作用

在不更改原函数调用方式的前提下对原函数添加新功能

3.装饰器的本质--闭包

4.装饰器

  (1)简单的装饰器

def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper def func():
print('这是原函数!') func = deco(func)
func()

  (2)装饰器的语法糖-----@deco

def deco(f):
def wrapper():
"""原函数前添加的功能"""
f()
"""原函数后添加的功能"""
return wrapper @deco # ——>此处效果等同于 func = deco(func)
def func():
print('这是原函数') func()

  (3)带返回值的装饰器

def deco(f):
def wrapper():
"""原函数前添加的功能"""
res = f()
"""原函数后添加的功能"""
return res
return wrapper @deco
def func():
print('这是原函数')
func()

  (4)装饰器加参数的固定格式

def deco(f):
def wrapper(*args,**kwargs):
"""原函数前添加的功能"""
res = f(*args,**kwargs)
"""原函数后添加的功能"""
return res
return wrapper @deco
def func(*args,**kwargs):
print('这是原函数')
func()

  (5)装饰器的固定格式--wraps版

from functools import wraps

def wrapper(func):
@wraps(func)
def inner(*args,**kwargs):
print('在被装饰的函数执行之前做的事')
ret = func(*args,**kwargs)
print('在被装饰的函数执行之后做的事')
return ret
return inner
@wrapper
def holiday(day):
print("新年快乐")
return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret) >>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心

  

(6) 多个装饰器装饰一个函数 

def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
func()
print('wrapper1 ,after func')
return inner1 def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
func()
print('wrapper2 ,after func')
return inner2 @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():
print('in f') f() >>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

  

  

python函数-装饰器的更多相关文章

  1. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  2. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  3. Python 函数装饰器

    首次接触到装饰器的概念,太菜啦! Python 装饰器可以大大节省代码的编写量,提升代码的重复使用率.函数装饰器其本质也是一个函数,我们可以把它理解为函数中定义了一个子函数. 例如我们有这么一个需求, ...

  4. Python @函数装饰器及用法

    1.函数装饰器的工作原理 函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn ...

  5. Python @函数装饰器及用法(超级详细)

    函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn() # 执行传入的fn参 ...

  6. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  7. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  8. Python 函数装饰器简明教程

    定义类的静态方法时,就使用了装饰器.其实面向对象中的静态方法都是使用了装饰器. @staticmethod def jump(): print(" 3 meters high") ...

  9. Python高手之路【四】python函数装饰器,迭代器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. linux安装软件的几种方法----linux下编译安装软件的一般步骤

    linux安装软件的几种方法: 一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd so ...

  2. MySQL 通过SQL语句导出表为文件

    SELECT * //你要导出的字段 FROM `tabel` //表名 INTO OUTFILE "D:\\file.txt" //导出的文件路径和文件名 LINES TERMI ...

  3. 小程序列表循环出来的list是不同接口赋的值

    需求:首页有三个列表,样式形式都是一样的,可以循环展示,但是循环的内容list部分是来自于不同的三个接口. data: { indexList:[{ name: "中考体能突击营" ...

  4. day01-Python运维开发基础

    还是用思维导图来一遍,印象更深!

  5. android中的简单animation(四)3D transition

    animation_main_screen.xml: <?xml version="1.0" encoding="utf-8"?> <Fram ...

  6. Python在运行中发生错误怎么正确处理方法,案例详解!

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...

  7. 习题两则的简化(利用for循环)

    习题一.打印26个英文字母 public class PrintChars { public static void main(String[] args) { char ch = 'a'; int ...

  8. java学习之IO流(学习之旅,一)

    个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...

  9. java 图片上传

    代码是最有力量的,嘎嘎 @CrossOrigin@ApiOperation(value = "上传图片", notes = "上传图片", httpMethod ...

  10. JAVA笔记03 变量和运算符 面试题以及笔记

    标识符的命名规则需要注意哪几点? 定义 就是给类,接口,方法,变量等起名字的字符序列 组成规则 英文大小写字母 数字 $和_ 注意事项 不能以数字开头 不能是java中的关键字 区分大小写 常见的命名 ...