python装饰器基础及应用
一、简介
装饰器是是修改其它函数功能的函数;其意义是让其他函数在不修改任何代码的前提下增加额外功能
二、数据类型

首先我们来看一段简单的代码:
from types import MethodType,FunctionType class A(object):
def f1(self):
pass def f2(a, b):
return a + b if __name__ == '__main__':
a = A()
print(type(a.f1)) #<class 'method'>
print(type(f2)) #<class 'function'>
结论:不难看出,f1的类型是方法,f2的类型是函数;那有人会问了解这个有啥作用呢?其实了解这个有助于我们下面了解装饰器的原理
三、认识装饰器:

let's go... 我们来看一个案例:
def B():
print("now you are inside the B() function") def sing():
return "now you are in the sing() function" def eat():
return "now you are in the eat() function" def sleep():
return "now you are in the sleep() function" print(sing())
print(eat())
print(sleep())
#输出的结果为:
now you are inside the hi() function
now you are in the sing() function
now you are in the eat() function
now you are in the sleep() function
结论:那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数
我们再接着看一段代码,如何让函数作为参数传给另外一个函数的:
def A():
return "hi 小陈!" def doSomethingBeforeA(func):
print("I am doing some boring work before executing A()")
print(func()) #执行:
doSomethingBeforeA(A)
#输出结果:
I am doing some boring work before executing A()
hi 小陈!
什么?你还没看懂,那我们再看一个案例:

from types import FunctionType def text():
return "Hello world!" def add_itali(func: FunctionType):
def new_func():
#print("now you are in the new_func() function")
return text() #返回text()函数
return new_func
#执行:
print(type(add_itali(text)))
print(add_itali(text)())
#输出结果:
<class 'function'>
Hello world!
难么现在你看懂了么?如果还是没懂,没关系我们再来看看下一段代码:
def new_decorator(func):
def wrapTheFunction():
print("I am doing some boring work before executing func()")
func()
print("I am doing some boring work after executing func()")
return wrapTheFunction def requiring_decoration():
print("I am the function which needs decoration")
#执行:
requiring_decoration() #输出结果:
I am the function which needs decoration
#执行:
new_decorator(requiring_decoration)() #输出结果:
I am doing some boring work before executing func()
I am the function which needs decoration
I am doing some boring work after executing func()
有人会有疑问,new_decorator(requiring_decoration)()为哈后面要加“()”呢去,请继续往下看:
#执行:
print(new_decorator(requiring_decoration)) #输出结果:
function new_decorator.<locals>.wrapTheFunction at 0x000001FC976BB620>
为什么会这样呢,请随我娓娓道来。。。

四、装饰器的优雅使用:

那么好,我们把上面代码再优化下,用装饰器常用的表达方式表示出来:
def new_decorator(func):
def wrapTheFunction():
print("I am doing some boring work before executing func()")
func() #被装饰的函数
print("I am doing some boring work after executing func()")
return wrapTheFunction @new_decorator
def requiring_decoration():
print("I am the function which needs decoration")
#执行:
requiring_decoration() #输出结果:
I am doing some boring work before executing func()
I am the function which needs decoration
I am doing some boring work after executing func()
老铁们,现在你们懂了么,没懂我们再来看一段代码:
#需求: <b><i> Hello World!</i></b>
from types import FunctionType
def add_bold(func: FunctionType):
def new_func():
return f"<b>{func()}</b>"
return new_func def add_itali(func: FunctionType):
def new_func():
return f"<i>{func()}</i>"
return new_func @add_itali # 语法
@add_bold
def text():
return "Hello world!"
#执行:
print(text()) #输出结果:
<i><b>Hello world!</b></i>
五、总结:

#语法:装饰器就是一个函数
def 装饰器名(func):
def wrapper(*args, **kwargs):
// 要做的装饰 ,,省略若干代码
result = func(*args,**kwargs)
return result
return wrapper
python装饰器基础及应用的更多相关文章
- Python装饰器基础及运行时间
一.装饰器基础 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会处理被装饰的函数,然后把他返回,或者将其替换成另一个函数或可调用对象. eg:decorate装饰器 @decor ...
- Python装饰器基础
一.Python装饰器引入 讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个 ...
- Python基础(五) python装饰器使用
这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...
- Python开发基础-Day7-闭包函数和装饰器基础
补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...
- [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析
python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- (转载)Python装饰器学习
转载出处:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方 ...
随机推荐
- 要求用户输入用户名和密码,只要不是admin、888888就
要求用户输入用户名和密码,只要不是admin.888888就一直提示用户名或密码错误,请重新输入 Console.WriteLine("输入账号和密码"); string a = ...
- C#循环判断密码
要求用户输入用户名和密码,只要不是admin.888888就一直提示用户名或密码错误,请重新输入 while (true) { Console.WriteLine("请输入帐号和密码&q ...
- [C#.NET 拾遗补漏]12:死锁和活锁的发生及避免
多线程编程时,如果涉及同时读写共享数据,就要格外小心.如果共享数据是独占资源,则要对共享数据的读写进行排它访问,最简单的方式就是加锁.锁也不能随便用,否则可能会造成死锁和活锁.本文将通过示例详细讲解死 ...
- ClassNotFoundException: java.util.ArrayList$SubList 错误
ClassNotFoundException: java.util.ArrayList$SubListjava.lang.RuntimeException: java.lang.ClassNotFou ...
- VirtualBox上桥接方式安装CentOS之后借助宿主上网
VirtualBox上桥接方式安装CentOS之后借助宿主上网: 修改centos文件: 1 vi /etc/sysconfig/network-scripts/ifcfg-eth0 增加以下几项: ...
- 经典c程序100例==31--40
[程序31] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字 ...
- 2012年游戏软件开发独立本科段01B0815自考科目教材
代码-----------教材名----------------------------版本----------作者 03708--------中国近现代史纲要----------------高教08 ...
- SpringBoot中的响应式web应用
目录 简介 Reactive in Spring 注解方式使用WebFlux 编程方式使用webFlux Spring WebFlux的测试 总结 简介 在Spring 5中,Spring MVC引入 ...
- waf 引擎 云原生平台tproxy 实现调研
了解了基本 云原生架构,不清楚的查看之前的文章:https://www.cnblogs.com/codestack/p/13914134.html 现在来看看云原生平台tproxy waf引擎串联实现 ...
- tcp输入数据 慢速路径处理 tcp_data_queue_ofo
tcp_data_queue_ofo 在新内核的实现中ofo队列实际上是一颗红黑树.在tcp_data_queue_ofo中根据序号,查找到合适位置,合并或者添加到rbtree中.同时设置dsack和 ...