Python编程系列---Python中装饰器的几种形式及万能装饰器

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

形式一:无参无返回值

 1 def outer(func):
 2     def wrapper():
 3         print("装饰器功能1")
 4         ret = func()
 5         print("装饰器功能2")          return ret
 6     return wrapper
 7
 8 # 定义一个无参无返回值的函数
 9 @outer
10 def main_func():
11     print("hello")
12
13 main_func()   # 开始执行
14
15
16 结果如下:
17 装饰器功能1
18 hello
19 装饰器功能2
20
21 进程已结束,退出代码 0

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

形式二:无参有返回值

 1 def outer(func):
 2     def wrapper():
 3         print("装饰器功能1")
 4         ret =func()
 5         print("装饰器功能2")
 6         return ret
 7     return wrapper
 8
 9 # 定义一个无参有返回值的函数
10 @outer
11 def main_func():
12     return "hello"
13
14
15 print(main_func()
16
17
18 结果如下:
19 装饰器功能1
20 装饰器功能2
21 hello
22
23 进程已结束,退出代码 0

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

形式三:有参无返回值

 1 def outer(func):
 2     def wrapper(str1):
 3         print("装饰器功能1")
 4         ret =func(str1)
 5         print("装饰器功能2")
 6         return ret
 7     return wrapper
 8
 9 # 定义一个有参无返回值的函数
10 @outer
11 def main_func(str1):
12     print("hello "+str1)
13
14
15 main_func("Python")
16
17
18 结果如下:
19 装饰器功能1
20 hello Python
21 装饰器功能2
22
23 进程已结束,退出代码 0

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

形式四:有参有返回值

 1 def outer(func):
 2     def wrapper(str1):
 3         print("装饰器功能1")
 4         ret =func(str1)
 5         print("装饰器功能2")
 6         return ret
 7     return wrapper
 8
 9 # 定义一个有参有返回值的函数
10 @outer
11 def main_func(str1):
12     return "hello "+str1
13
14
15 print(main_func("Python"))
16
17
18 结果如下:
19 装饰器功能1
20 装饰器功能2
21 hello Python
22
23 进程已结束,退出代码 0

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

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

 1 def set_func(func):
 2     def wrapper(*args,**kwargs):
 3         print("装饰器功能1")
 4         return func(*args,**kwargs)
 5     return wrapper
 6
 7 @set_func
 8 def show1():
 9     print("----show1----")
10
11 @set_func
12 def show2(string,n,l):
13     return ‘Hello‘ + string + str(n) + ‘:‘.join(l)
14
15 show1()
16 print(show2(‘ world ‘, 2, [‘one‘, ‘two‘, ‘three‘]))
17
18
19 结果如下:
20 装饰器功能1
21 ----show1---
22 装饰器功能1
23 Hello world 2one:two:three
24
25 进程已结束,退出代码 0

原文地址:https://www.cnblogs.com/ywk-1994/p/9502510.html

时间: 2024-11-12 01:51:52

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

代写python,代写python编程,python代写,python编程代写,留学生python代写

代写python,python代写,代写python编程,python编程代写,留学生python代写 本人以及代写团队成员均毕业于国内.海外计算机专业知名学府,现均就职于国内顶尖互联网企业任职高级开发工程师,现利用闲暇之余接编程代写,具体接单范围如下: 代写python,python代写,python编程代写,python课程远程辅导 代写C语言,代写C++ 代写java,java编程代写 代写操作系统operation system 代写计算机网络computing network 代写Li

Python中变量赋值的8种形式、需要注意哪些细节?

本文解释python中变量赋值的形式,并解释一些细节. python中变量赋值的几种形式 1 x = "long" # (1).基本形式 2 x, y = "long", "shuai" # (2).元组对应赋值 3 [x, y] = ["long", "shuai"] # (3).列表对应赋值 4 a, b, c, d = "long" # (4).序列赋值 5 a, *b = 'lo

零基础能学Python编程吗 Python就业市场怎样

零基础能学Python编程吗?Python就业市场怎样?Python的用处很广,比如数据挖掘,数据分析,网络爬虫,机器学习,科学计算哲学前沿领域都Python的用武之地. 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的,因为现在Python正在朝着3.x版本进化,在进化过程中,大量的针对2.x版本的代码要修改后才能运行.所以,目前有许多第三方库还暂时无法在3.x上使用. ? ? 学习Python语言,就像学习其他编程语言或者是学习某门外语一样 ,我们应该从Py

Python入门之python装饰器的4种类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) return r return inner @wrapFun def myadd(a, b): return a + b print(myadd(2, 3)) 二:函数装饰类 def wrapClass(cls): def inner(a): print('class name:', cls.__na

python编程系列---tcp服务端的简单实现

流程如下: """tcp服务端创建流程1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求2. 绑定端口3. server_socket开启监听,由主动连接模式变为被动接受模式4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信5. 使用新创建的socket与客户端通信6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信7. server_sock

Python | 基础系列 ·?Python为什么没有switch/case语句?

与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): switcher = { 0: "zero", 1: "one", 2: "two", } return switcher.get(argument, "nothing") 这段代码的作用相当于: function(argument)

python学习系列--python内置函数(一)

先列出所有的python内置函数,可以看到还是挺多的. abs()        求给定数的绝对值. all()          传入一个列表,只有当列表中所有元素都是真时,该函数返回真. any()        传入一个列表,只要列表中有一个元素为真,该函数即返回真. ascii()       执行对象中的__repr__方法.该函数在python2.7中已弃用. bin()         将给定的值转换成二进制. bool()       判断真假. bytearray()     

【流畅的python】系列——python数据结构之序列2

文章内容接上篇 三.切片 <流畅的python>的第2章中,对于切片的简单用法,只是一带而过: 在 Python 里,像列表(list).元组(tuple)和字符串(str)这类序列类型都支持切片操作,但是实际上切片操作比人们所想象的要强大很多. 文中,主要讲了切片的3个方面: 1.为什么在python中,切片和区间会忽略最后一个元素(即左闭右开) 2.对象的切片 3.给切片赋值 另外,还提及了多维切片和省略 3.1.为什么在python中,切片和区间会忽略最后一个元素(即左闭右开) 在切片和

python编程(python开发的三种运行模式)【转】

转自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 单循环模式 多线程模式 reactor模式 [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用pyt