python装饰器的参数传递
被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名),当下边通过该函数名调用时,会调用到装饰器内部的那个函数()
装饰器:在不修改函数源代码的基础上,添加函数功能
一个简单的装饰器
def log_time(func): # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用
def make_decorater():
print('现在开始装饰')
func()
print('现在结束装饰')
return make_decorater # log_time()被调用后,运行此函数返回make_decorater()函数的引用make_decorater @log_time # 此行代码等同于,test=log_time(test)=make_decorater
def test():
print('我是被装饰的函数')
test() # test()=make_decorater()
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰 Process finished with exit code 0
当被装饰的函数有形参时
def log_time(func):
def make_decorater(*args,**kwargs): # 接受调用语句的实参,在下面传递给被装饰函数(原函数)
print('现在开始装饰')
test_func = func(*args,**kwargs) # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回
print('现在结束装饰')
return test_func # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。
return make_decorater @log_time
def test(num):
print('我是被装饰的函数')
return num+1 a = test(2) # test(2)=make_decorater(2)
print(a)
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰
3 Process finished with exit code 0
当@装饰器后有参数时
def get_parameter(*args,**kwargs): # 工厂函数,用来接受@get_parameter('index.html/')的'index.html/'
def log_time(func):
def make_decorater():
print(args,kwargs)
print('现在开始装饰')
func()
print('现在结束装饰')
return make_decorater
return log_time
@get_parameter('index.html/')
def test():
print('我是被装饰的函数')
# return num+1
test() # test()=make_decorater()
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
('index.html/',) {}
现在开始装饰
我是被装饰的函数
现在结束装饰 Process finished with exit code 0
两个装饰器同时修饰一个函数(重点看执行顺序)
def log_time1(func):
def make_decorater(*args,**kwargs):
print('1现在开始装饰')
test_func = func(*args,**kwargs)
print('1现在结束装饰')
return test_func
return make_decorater def log_time2(func):
def make_decorater(*args,**kwargs): # 接受调用语句的实参,在下面传递给被装饰函数(原函数)
print('2现在开始装饰')
test_func = func(*args,**kwargs) # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回
print('2现在结束装饰')
return test_func # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。
return make_decorater @log_time1
@log_time2
def test(num):
print('我是被装饰的函数')
return num+1 a = test(2) # test(2)=make_decorater(2)
print(a)
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
1现在开始装饰
2现在开始装饰
我是被装饰的函数
2现在结束装饰
1现在结束装饰
3 Process finished with exit code 0
注意看执行结果(print,只有执行就会输出到屏幕)(return将数据返回给接受的变量或引用)
def makeBold(fn):
def wrapped1():
print('1')
b = "<b>" + fn() + "</b>" # 此行fn()调用了wrapped(),所以wrapped()执行了print输出到屏幕,然后fn()接受到了wrapped() return返回的结果"<i>" + fn() + "</i>",所以需要等待wrapped()
print('1end') # 只有b = "<b>" + fn() + "</b>"执行完毕才会执行这一行,只有wrapped()函数 return返回后,上一行代码才执行
return b
return wrapped1 def makeItalic(fn):
def wrapped():
print('2')
a = return "<i>" + fn() + "</i>" # 此行fn()调用了test3(),所以test3()执行了,然后fn()接受到了test3()中returnd返回的结果"hello world-3",所以需要等待test3
print('2end') # 当test3()返回后,上一行代码执行完毕,在屏幕上输出此行
return a
return wrapped @makeBold
@makeItalic
def test3():
return "hello world-3" # return 给了wrapped,wrapped又return给了wrapped; a = test3() # 此行test3() = wrapped1(),test3()调用了函数所以装饰器才执行。a接受了装饰器return的结果
print(a)
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/text.py
1
2
2end
1end
<b><i>hello world-3</i></b> Process finished with exit code 0
python装饰器的参数传递的更多相关文章
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- python 装饰器、内部函数、闭包简单理解
python内部函数.闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别. 1.python内部函数 python内部函数示例: def test(*args): def a ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- Python第二十六天 python装饰器
Python第二十六天 python装饰器 装饰器Python 2.4 开始提供了装饰器( decorator ),装饰器作为修改函数的一种便捷方式,为工程师编写程序提供了便利性和灵活性装饰器本质上就 ...
- 如何理解Python装饰器
如何理解Python装饰器?很多学员对此都有疑问,那么上海尚学堂python培训这篇文章就给予答复. 一.预备知识 首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 F ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- Python装饰器探险
关于python装饰器的理解和用法,推荐廖雪峰老师和这一篇博客以及知乎 以下代码均已手动敲过,看完本篇内容,包你装饰器小成! 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就 ...
- Python装饰器--decorator
装饰器 装饰器实质是一个函数,其作用就是在不改动其它函数代码的情况下,增加一些功能.如果我们需要打印函数调用前后日志,可以这么做 def log(func): print('%s is running ...
随机推荐
- HDU 4952 Number Transformation 多校8 机智数学
哎.这个题想了好久,状态不对啊...一个大家都出的题..当时想到肯定是可以有什么规律来暴力,不用算到10的10次方 对于某个k,x.从1到k循环,每次求一个新的x,这个x要大于等于原x,并且要是i的倍 ...
- ACM-AK吧!少年
题目描述:AK吧!少年 AK is an ACM competition finished all of the problems. AC This problem is one of the ste ...
- jedis哨兵模式的redis组(集群),连接池实现。(客户端分片)
java 连接redis 我们都使用的 是jedis ,对于redis这种频繁请求的场景我们一般需要对其池化避免重复创建,即创建一个连接池 ,打开jedis的 jar包我们发现,jedis对池已经有 ...
- Linux基础操作及概念
Linux基础操作及概念 终端的概念 通常我们在使用 Linux 时,并不是直接与系统打交道,而是通过一个叫做 Shell 的中间程序来完成的,在图形界面下为了实现让我们在一个窗口中完成用户输入和显示 ...
- NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令
NVIDIA Jetson TX2 查看系统参数状态. 当前博主的TX2更新的版本为:Jetpack 3.3, cuda 9.0.252, cudnn7.0, opencv3.3.1, TensorR ...
- 关于SI4432数据手册的简单讲解
SI4432是高度集成度单芯片无线ISM收发器件.EZRadioPRO系列包括了发射机.接收机和射频收发器,让设计工程师可以有选择的设计利用里面的无线部分. SI4432提供了先进的无线功能,包括连续 ...
- rdlc报表带参数打印
1.新建rdlc文件报表 2.选中rdlc文件=>视图=>报表资料 添加几个参数,如图 设计报表页面 int WaitNum = this.queueDTOs.Where(m=>m. ...
- Essay写作用对标点符号很重要!
很多留学生在essay写作中对于标点符号的正确使用可能不是太清楚,今天Meeloun小编给大家整理了一些关于标点符号的正确打开方式,希望可以帮到同学们! Colloquialism俗语: 如果要在写作 ...
- DP背包问题学习笔记及系列练习题
01 背包: 01背包:在M件物品中取出若干件物品放到背包中,每件物品对应的体积v1,v2,v3,....对应的价值为w1,w2,w3,,,,,每件物品最多拿一件. 和很多DP题一样,对于每一个物品, ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...