根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式:

形式一:无参无返回值

 def outer(func):
def wrapper():
print("装饰器功能1")
ret = func()
print("装饰器功能2")
  return ret
return wrapper # 定义一个无参无返回值的函数
@outer
def main_func():
print("hello") main_func() # 开始执行 结果如下:
装饰器功能1
hello
装饰器功能2 进程已结束,退出代码 0

总结: 装饰器功能1 装饰器功能2 可以根据具体项目需求需要的附加功能来写具体代码,可以在原功能函数之前,也可以在其之后

形式二:无参有返回值

 def outer(func):
def wrapper():
print("装饰器功能1")
ret =func()
print("装饰器功能2")
return ret
return wrapper # 定义一个无参有返回值的函数
@outer
def main_func():
return "hello" print(main_func() 结果如下:
装饰器功能1
装饰器功能2
hello 进程已结束,退出代码 0

总结: 装饰器功能1 装饰器功能2 可以根据具体项目需求需要的附加功能来写具体代码,可以在原功能函数之前,但不能在原功能函数之后

形式三:有参无返回值

 def outer(func):
def wrapper(str1):
print("装饰器功能1")
ret =func(str1)
print("装饰器功能2")
return ret
return wrapper # 定义一个有参无返回值的函数
@outer
def main_func(str1):
print("hello "+str1) main_func("Python") 结果如下:
装饰器功能1
hello Python
装饰器功能2 进程已结束,退出代码 0

总结: 装饰器功能1 装饰器功能2 可以根据具体项目需求需要的附加功能来写具体代码,可以在原功能函数之前,也可以在其之后

形式四:有参有返回值

 def outer(func):
def wrapper(str1):
print("装饰器功能1")
ret =func(str1)
print("装饰器功能2")
return ret
return wrapper # 定义一个有参有返回值的函数
@outer
def main_func(str1):
return "hello "+str1 print(main_func("Python")) 结果如下:
装饰器功能1
装饰器功能2
hello Python 进程已结束,退出代码 0

总结: 装饰器功能1 装饰器功能2 可以根据具体项目需求需要的附加功能来写具体代码,可以在原功能函数之前,但不能在原功能函数之后

现在用万能装饰器来实现以上四种形式的装饰器:

 def set_func(func):
def wrapper(*args,**kwargs):
print("装饰器功能1")
return func(*args,**kwargs)
return wrapper @set_func
def show1():
print("----show1----") @set_func
def show2(string,n,l):
return 'Hello' + string + str(n) + ':'.join(l) show1()
print(show2(' world ', 2, ['one', 'two', 'three'])) 结果如下:
装饰器功能1
----show1---
装饰器功能1
Hello world 2one:two:three 进程已结束,退出代码 0

如果你和我有共同爱好,我们可以加个好友一起交流!

Python编程系列---Python中装饰器的几种形式及万能装饰器的更多相关文章

  1. shell编程系列7--shell中常用的工具find、locate、which、whereis

    shell编程系列7--shell中常用的工具find.locate.which.whereis .文件查找之find命令 语法格式:find [路径] [选项] [操作] 选项 -name 根据文件 ...

  2. shell编程系列6--shell中的函数

    shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...

  3. WPF编程,C#中对话框自动关闭的一种方法。

    原文:WPF编程,C#中对话框自动关闭的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...

  4. python编程系列---多个装饰器装饰一个函数的执行流程

    首先看一个例子 ''' 多个装饰器装饰一个函数 ''' # 定义第一个装饰器 def set_func1(func): def wrapper1(*args,**kwargs): print('装饰内 ...

  5. Python编程系列---使用装饰器传参+字典实现动态路由

    # 实现一个空路由表,利用装饰器将url和功能函数的对应关系自动存到这个字典中 router_dict = {} # 定义一个装饰器 # 再给一层函数定义,用来传入一个参数,这个参数就是访问的页面地址 ...

  6. Python编程系列---装饰器执行的底层原理及流程

    代码中No.1  No.2 ...表示执行流程 """No.1 No.2 ...表示执行流程""" def set_func(func): ...

  7. Python编程系列---获取请求报文行中的URL的几种方法总结

    在浏览器访问web服务器的时候,服务器收到的是一个请求报文,大概GET请求的格式大概如下: 先随便拿到一个请求报文,蓝色即为我们要获取的 GET  /index.html  HTTP/1.1  Hos ...

  8. python编程系列---Pycharm快捷键(更新中....)

    以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...

  9. python编程系列---多线程共享全局变量出现了安全问题的解决方法

    多线程共享全局变量出现了安全问题的解决方法 当多线程共享全局变量时,可能出现安全问题,解决机制----互斥锁:即在在一段与全局变量修改相关的代码中,假设一个时间片不足以完成全局变量的修改,就在这段代码 ...

随机推荐

  1. ES6新增常见特性

    一:声明属性let const var let const 区别 1.var声明变量会发生变量提升,let.const不会发生变量提升 2.var允许重复声明变量,let不可以 3.const声明变量 ...

  2. java http/https后台上传服务器视频到接口

    没有代码得帖子都是耍流氓,废话不说,上代码 //上传视频    public static HttpEntity getMultiDefaultFileEntity(String pathlj,Str ...

  3. (转)在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境

    阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器.我们在 ...

  4. intellij idea 2018 激活

    http://idea.toocruel.net http://active.chinapyg.com/ 2018-8-6可用 http://xdouble.cn:8888/ 2018年7月11号 测 ...

  5. Android蓝牙低功耗(BLE)模块设计

    在阅读这篇文章之前你应该对GATT和Android蓝牙框架有一定的了解.这里不会向你解释Service.Characteristics等蓝牙知识.这里只是我写下我对Android Ble的再次封装来适 ...

  6. js深度克隆对象、数组

    function deepCopy(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { ...

  7. mysql root密码忘记

    首先停掉mysql服务,在/etc/my.cnf中添加 skip-grant-tables,同时可以添加skip-networking选项来禁用网络功能,防止这时其他人通过网络连接到数据库 [mysq ...

  8. Mysql高手系列 - 第21篇:什么是索引?

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第21篇. 本文开始连续3篇详解mysql索引: 第1篇来说说什么是索引? 第2篇详解Mysql中 ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK上板载调试器的用法. 本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.M ...

  10. springboot使用百度富文本UEditor遇到的问题一览(springboot controller中request.getInputStream无法读取)

    先吐槽一下UEditor作为一个前端的js类库,非要把4种后端的代码给出来,而实际生产中用的框架不同,其代码并不具有适应性.(通常类似其它项目仅仅是给出数据交互的规范.格式,后端实现就可以自由定制) ...