python装饰器系列(二)

对python装饰器系列(一)的deco函数进行修改:

1 def deco(fn):
2     def wrap():
3         print(‘ha ha ha‘)
4         print(‘call {0} funtion‘.format(fn.__name__))
5         fn()
6     return wrap
1 @deco
2 def myfun():
3     print(‘call myfun‘)
1 myfun()
2
3 ha ha ha
4 call myfun funtion
5 call myfun

myfun()函数被deco(fn)函数进行修饰后,调用myfun()时就像被施加了魔法一样在执行此函数前附加的执行了一些操作

有参数的装饰器

1 def deco(fn):# 考虑到被装饰的函数可以接收的参数类型的不确定性,可以用可变位置参数和可变关键字参数来捕捉,即(*args,**kwargs)
2     def wrap(*args,**kwargs):
3         print(‘ha ha ha‘)
4         print(‘call {0} funtion‘.format(fn.__name__))
5         return fn(*args,**kwargs)
6     return wrap
1 @deco
2 def myfun(x):
3     return x ** 2
1 myfun(5)
1 ha ha ha
2 call myfun funtion
3
4 25
1 myfun.__name__
2 ‘wrap‘

myfun(x)函数被deco(fn)函数装饰后,函数对象的__name__属性会发生改变,发上输出。因为@deco就相当于执行了myfun = deco(myfun),即变量myfun已经指向了wrap(*args,**kwargs)函数,这时myfun变量指向函数的__name__属性就是wrap,不再是原来的myfun()函数的__name__属性。

如果要修正这个问题,可以直接引用python内置的functools.wraps方法

1 import functools
2 def deco(fn):
3     @functools.wraps(fn)
4     def wrap(*args,**kwargs):
5         print(‘ha ha ha‘)
6         print(‘call {0} funtion‘.format(fn.__name__))
7         return fn(*args,**kwargs)
8     return wrap
1 @deco
2 def myfun(x):
3     return x ** 2
1 @deco
2 def myfun(x):
3     return x ** 2
1 myfun(25)
2
3 ha ha ha
4 call myfun funtion
5 625
myfun.__name__
‘myfun‘

总结:装饰器其实也是一个函数,此函数可以接收一个函数作为参数,并返回一个函数,即也是一个高阶函数。装饰器这个函数能让一个函数在调用时的前或后额外的执行一些操作来修改原调用的函数

原文地址:https://www.cnblogs.com/tianshug/p/10921788.html

时间: 2024-10-09 18:06:30

python装饰器系列(二)的相关文章

python装饰器系列(五)

带参数的装饰器的应用: 比如有一个函数,只有在对有许可权限的用户开放,执行此函数的用户没有在认证列表里的,就不会执行这个函数.这个该如何实现呢?如下: 1 def check(allow_users): 2 def inner_check(fn): 3 def wrap(username,*args,**kwargs): 4 '''This is wrap''' 5 if username in allow_users: 6 return fn(username,*args,**kwargs)

python装饰器系列(三)

装饰器的应用实例 1 import time 2 def timeit(fn): 3 start = time.time() 4 fn() 5 print(time.time() - start) 6 7 def sleep(): 8 time.sleep(3) 上边代码定义了两个函数,timeit函数能够模拟计算出在执行fn函数所花费的时间 1 timeit(sleep) 2 3.003638505935669 这样来计算一个函数的执行时间是有缺陷的,sleep函数必须是一个接收参数的函数,那

python装饰器系列(四)

带参数的装饰器 先来看一个不带参数的装饰器 1 import time 2 3 def timeit(fn): 4 def wrap(*args,**kwargs): 5 start = time.time() 6 ret = fn(*args,**kwargs) 7 print(time.time() - start) 8 return ret 9 return wrap 10 11 12 @timeit 13 def sleep(x): 14 time.sleep(x) 1 sleep(3)

Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

遥想大肠包小肠----python装饰器乱弹

说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语法形式 def  mydec(wenwa): def inner(*args,**kwagrs): ret = wenwa(*args,**kwargs) return ret  #请务必别忘记这还有个该死的return,如果被执行的函数没有返回值return,则ret为None return in

Day5 python装饰器

一.python装饰器基本概念 定义:本质是函数,用来装饰其他函数,即为其他函数添加附加功能. 原则:1.不能修改被装饰函数的源代码:    2.不能修改被装饰函数的调用方式. 实现装饰器的知识储备: 1.函数即"变量". 2.高阶函数 a.把一个 函数名 当作实参传给另一个函数: b.返回值中包含 函数名 . 3.嵌套函数 即在用def定义一个函数的函数体中再用def定义函数. 高阶函数 + 嵌套函数 => 装饰器 二.函数即"变量" 定义一个变量 1 x