‘@’引用已有的函数,对下面的函数进行修饰。引用函数必须放在修饰函数的上面,引用函数的返回值,返回给被修饰的函数

一个简单的栗子:

 def funA(fn):
print('A')    # 输出A
fn() # 执行传入的fn参数  输出B
return 'fkit'  # 返回给funB
'''
下面装饰效果相当于:funA(funB),
funB将会替换(装饰)成该语句的返回值;
由于funA()函数返回fkit,因此funB就是fkit
'''
@funA
def funB():
print('B')
print(funB) # 此时再运行funB函数输出的是fkit

这里funA是引用的函数,funB是被修饰的函数。@修饰符的功能就是把funB当做参数传递给funA,然后把funA的返回值返回到funB

这意味着程序要完成两步操作:

将 funB 作为 funA() 的参数,也就是上面代码中 @funA 相当于执行 funA(funB)。

将 funB 替换成上一步执行的结果,funA() 执行完成后返回 fkit,因此 funB 就不再是函数,而是被替换成一个字符串。

输出如下:

A
B
Fkit

当然,也可以返回一个函数,看下面这个栗子:

 def my_decorator(func):
def wrapper(): # 暂时跳过这个函数
'''decorator'''
print('Decorated function...')
print('')
return wrapper # 把wrapper函数返回给test @my_decorator # decorator(test())
def test():
"""Testword"""
print('Test function') test()
print("函数名:%s" % test.__name__) 输出如下:
123
Decorated function...
函数名:wrapper

可以看出,最先输出了第五行的‘123’,然后是第四行的‘Decorated function...’,最后是第十六行的函数名,下面捋一下代码的执行顺序:

最先执行了第9行代码,开始运行被引用函数,被引用函数的返回值是里面的嵌套函数wrapper,暂时跳过这个嵌套函数,运行到第5行,此时输出‘123’;运行第六行把内嵌函数返回给test函数,此时@修饰符的作用就算是已经完成了,接下来,代码运行第15行,调用test函数,但此时并没有test里面的

'Test function',二是输出了wrapper里面的'Decorated function...',这就是把函数作为被引用函数返回值的效果,此时的test本质上已经不再是test了,二是被引用函数的返回值wrapper函数,所以输出内容是wrapper函数里面的,最后,我们输出函数名验证一下。

这就是@修饰符的作用了,还不会飞的小菜鸡,文章有错误欢迎大佬随时指正。
-----------------------------------------努力,不只是一种习惯,更是一种品质。

最新文章

  1. 如何提高Java并行程序性能??
  2. Distributed Databases and Data Mining: Class timetable
  3. JS的prototype和__proto__ Constructor
  4. 用swift实现自动录音器
  5. Java 多线程处理[全]
  6. Java的初步认识
  7. java计时代码
  8. SecureCRT上传bash: rz: command not found(转载)
  9. C++ 文件操作(CFile类)
  10. leetcode—word ladder II
  11. Spring 4.2 annotation event Publisher/Listener
  12. java-下载excel
  13. abiword Namespace List
  14. PostCss 从0开始
  15. xmu1214: 购物
  16. 基于Python的数据分析:数据库索引效率探究
  17. SpringMVC+Apache Shiro+JPA(hibernate)案例教学(二)基于SpringMVC+Shiro的用户登录权限验证
  18. go interface接口
  19. 转:JAVA中解决Filter过滤掉css,js,图片文件等问题
  20. shell环境变量

热门文章

  1. GIS基础软件及操作(五)
  2. Android多线程(三)
  3. Qt5下OpenGL程序的新写法
  4. C语言宏定义##连接符和#符的使用(MFC就是靠##自动把消息和消息函数对应起来了,借助宏来减少switch case代码的编写量)
  5. Delphi中动态调用TXMLDocument的经历
  6. vs2008在win7系统中安装不问题
  7. IIS上.net注册
  8. Lamda一行代码实现"36选7"随机自动选号
  9. 95+强悍的jQuery图形效果插件
  10. RocketMQ(2)---Docker集群部署RocketMQ