Python 之装饰器
Python 的装饰器可谓是提高开发效率的一大利器。然而初学装饰器的时候感觉很难理解,因为除了 Python 之外没听说哪个语言有这种东西。
而且网上看的很多解释看似容易理解,但只能很快理解了装饰器能用来干嘛,看完了还是有点懵。
在我看来 Python 装饰器的本质就是:利用 Python 能够将函数作为参数、返回值,且支持函数嵌套的特性。新建一个函数作为装饰器来给已有的函数添加功能。
Talk is Cheap,直接来看代码:
def a_good_decorater(a_func):
#装饰器函数
def wrap_a_func():
print("Hit You")
a_func()
print("Hit You Again")
return wrap_a_func @a_good_decorater#此处为 Python 语法糖 可以方便地装饰函数
def pri():
print("HaHaHa, This is my first decorater") pri() >>>hit You
>>>HaHaHa, This is my first decorater
>>>hit You Again
装饰器的流程如下:
1.新建一个函数,这里称为装饰器。
2.在函数中再次建立一个函数,这里把它称为装饰函数,用来给函数添加功能。这么做的意义是能让函数经过装饰后仍然是一个函数。如果不这么做,那么就会在装饰过程中就执行函数了,还想达到期望的效果就需要在每次条用函数前都用装饰器来装饰函数,大大减少了开发效率。
3.装饰器的返回值为装饰函数。
4.将函数修改为装饰函数装饰过后的函数。
以此处代码为例,这么做完以后相当于在函数上下都加了一行 print 命令。
所以,装饰器的作用就是以同一种方式修改函数,适用于大量函数都需要添加同一功能的情况。
到这里,已经能够使用装饰器来装饰函数了。
但是,有一个问题。
由于装饰器中已经返回了装饰函数,所以相当于现有的函数已经被修改成装饰函数了,例如函数名就会是 wrap_a_func。看起来没什么问题,但是当需要用到函数属性的操作时就会出错。然而贴心的 Python 也为我们考虑到了。通过 functools.wraps 对装饰函数再次装饰,就能保留原函数的名字等。
from functools import wraps def a_good_decorater(a_func):
@wraps(a_func)
def wrap_a_func():
print("hit You")
a_func()
print("hit You Again")
return wrap_a_func @a_good_decorater
def pri():
print("HaHaHa, This is my first decorater") pri()
print(pri.__name__) >>>hit You
>>>HaHaHa, This is my first decorater
>>>hit You Again
>>>pri
Python 之装饰器的更多相关文章
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 关于python的装饰器(初解)
在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...
随机推荐
- 分布式ID生成策略 · fossi
分布式环境下如何保证ID的不重复呢?一般我们可能会想到用UUID来实现嘛.但是UUID一般可以获取当前时间的毫秒数再加点随机数,但是在高并发下仍然可能重复.最重要的是,如果我要用这种UUID来生成分表 ...
- [PyTorch入门]之从示例中学习PyTorch
Learning PyTorch with examples 来自这里. 本教程通过自包含的示例来介绍PyTorch的基本概念. PyTorch的核心是两个主要功能: 可在GPU上运行的,类似于num ...
- AIDLservice
有三种情况:如果直接使用服务,则没有必要进行绑定,但是如果要使用服务里面的方法,则要进行绑定.具体的启动情况有下: 其中很重要一点:bindService和unbindService是成对出现的. 1 ...
- UEditor问题整理
网上可以使用的富文本编辑器有很多,但是经过慎(sui)重(shou)思(yi)考(cha),选择了UEditor,毕竟是百度的东西,质量上应该经得起推敲,另外,使用别人的插件,总要去适应别人的编码习惯 ...
- Design Patterns in Android
对日常在 Android 中实用设计模式进行一下梳理和总结,文中参考了一些网站和大佬的博客,如 MichaelX(xiong_it) .菜鸟教程.四月葡萄.IAM四十二等,在这里注明下~另外强烈推荐图 ...
- ip修改成域名
将ip修改成域名,这样的话可以使程序变得更加健壮,别人不能直接看见你的ip地址. 后来总结下分享给大家.首先找到hosts文件的位置,这个文件是系统dns默认查找的文件. windows 系统:C:\ ...
- 关于Newtonsoft.Json引用报错
自己运行的vs版本是2012,然后同事用了2017的,我把代码发给他后运行发现报以下错误: {未能加载文件或程序集"Newtonsoft.Json, Version=4.5.0.0, Cul ...
- Burpsuite专题学习指南
点击蓝色字体即可 开启你的Burp学习之旅BurpSuite系列(一)----Proxy模块(代理模块) BurpSuite系列(二)----Target模块(目标模块) BurpSuite系列(三) ...
- NSURLSession的前世今生
系统网络框架架构图 前世-NSURLConnection NSURLConnection是苹果提供的原生网络访问类,已经有10多年的历史了,它从 iOS 2.0 开始,一直到iOS9被废弃.异步方法在 ...
- 【WPF学习】第五十四章 关键帧动画
到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...