1. def func(functionName):
  2. print("正在装饰")
  3. def func_in(*args, **kargs):
  4. print("------func_in---1--")
  5. res = functionName(*args, **kargs)
  6. print("------func_in---2---")
  7. return res
  8. print("装饰结束")
  9. return func_in
  10.  
  11. # 再还没有执行test函数的时候就开始装饰
  12. @func
  13. def test(a, b):
  14. print("--------test a=%d b=%d -----" % (a, b))
  15.  
  16. @func
  17. def test2(a, b, c, d):
  18. print("--------test2 %d %d %d %d -------" % (a, b, c, d))
  19.  
  20. @func
  21. def test3():
  22. return "hahaha"
  23.  
  24. print("%%%%%%%%%%%%%%%%%%% 不定长参数 %%%%%%%%%%%%%%%%")
  25. test(1, 2)
  26. test2(1, 2, 3, 4)
  27. print("%%%%%%%%%%%%%%%%%%% 返回值 %%%%%%%%%%%%%%%%")
  28. res = test3()
  29. print("test3 return value is %s" % res)

运行结果:

  1. 正在装饰
  2. 装饰结束
  3. 正在装饰
  4. 装饰结束
  5. 正在装饰
  6. 装饰结束
  7. %%%%%%%%%%%%%%%%%%% 不定长参数 %%%%%%%%%%%%%%%%
  8. ------func_in---1--
  9. --------test a=1 b=2 -----
  10. ------func_in---2---
  11. ------func_in---1--
  12. --------test2 1 2 3 4 -------
  13. ------func_in---2---
  14. %%%%%%%%%%%%%%%%%%% 返回值 %%%%%%%%%%%%%%%%
  15. ------func_in---1--
  16. ------func_in---2---
  17. test3 return value is hahaha

装饰器中return

  1. from time import ctime, sleep
  2. def func_args(args = "hello"):
  3. def func(functionName):
  4. print("正在装饰")
  5. def func_in():
  6. print("###### %s called in %s used %s ######" % (functionName.__name__, ctime(), args))
  7. functionName()
  8. return func_in
  9. return func
  10.  
  11. # 先执行func_args("hahah"),给args赋值,返回func的引用
  12. # @func
  13. # 使用@func对函数进行装饰
  14. @func_args("hahah")
  15. def test1():
  16. print("--------test1--------")
  17.  
  18. @func_args("heihei")
  19. def test2():
  20. print("---------test2----------")
  21.  
  22. # 带有参数的装饰器,能够起到,在运行时,根据参数值得不同,实现不同的功能
  23. test1()
  24. test2()

运行结果:

  1. 正在装饰
  2. 正在装饰
  3. ###### test1 called in Sun Aug 26 14:53:34 2018 used hahah ######
  4. --------test1--------
  5. ###### test2 called in Sun Aug 26 14:53:34 2018 used heihei ######
  6. ---------test2----------

python——装饰器(不定长参数,闭包,装饰器)示例的更多相关文章

  1. python函数中的参数(关键字参数,默认参数,位置参数,不定长参数)

    默认参数:定义函数的时候给定变量一个默认值. def num(age=1): 位置参数:调用函数的时候根据定义函数时的形参位置和实参位置进行引用. 关键字参数:如果定义的函数中含有关键字参数,调用函数 ...

  2. Python 不定长参数、全局变量、局部变量 day4

    一.不定长参数 在函数定义中,经常会碰到*args 和**kwargs作为参数. 事实上在函数中,*和**才是必要的,args和kwargs可以用其他名称代替 *args 是指不定数量的非键值对参数. ...

  3. 详解Python函数参数定义及传参(必备参数、关键字参数、默认可省略参数、可变不定长参数、*args、**kwargs)

    详解Python函数参数定义及传参(必备参数.关键字参数.默认可省略参数.可变不定长参数.*args.**kwargs) Python函数参数传参的种类   Python中函数参数定义及调用函数时传参 ...

  4. python函数中的不定长参数

    python自定义函数中有两中不定长参数,第一种是*name,第二种是**name.加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数.加了两个星号 ** 的参数会以字典的 ...

  5. python不定长参数 *argc,**kargcs(19)

    在 python函数的声明和调用 中我们简单的了解了函数的相关使用,然而在函数传递参数的时候,我们埋下了一个坑,关于不定长参数的传递我们还没有讲,今天这篇文章主要就是讲解这个问题. 一.函数不定长参数 ...

  6. python笔记(2)---不定长参数

    python自定义函数中有两种不定长参数, 第一种是*name:加了星号 * 的参数会以元组(tuple)的形式导入 第二种是**name:加了星号 * *的参数会以字典(dict)的形式导入 *na ...

  7. python中函数的不定长参数

    例1: #定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args ...

  8. python 不定长参数

    1 #不定长参数 * 元祖 ** 字典 2 def item(a,b,*c,**d): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8 item(11, ...

  9. java 不定长参数

    一,不定长参数的规定 一个方法只能有一个不定长参数,并且这个不定长参数必须是该方法的最后一个参数. 示例: public class VariArgs { public static void mai ...

随机推荐

  1. OpenCl入门getting-started-with-opencl-and-gpu-computing

    原文来自于:getting-started-with-opencl-and-gpu-computing/ 对整个程序的注释:http://www.kimicat.com/opencl-1/opencl ...

  2. Activiti使用总结

    工作流在我们日常的工作中用得可谓相当普及,尤其在企业内部管理系统,如考勤.财务.合同等系统中更是离不开它.在我们金融科技领域,工作流主要用于贷款审批.风控审核等环节.早期工作流在企业信息化发挥着很重要 ...

  3. 使用 django-redis 作缓存

    1  缓存内容使用 django支持多种不同的cache backend,默认使用的是localmem,django-redis 是一个使django支持 redis cache的功能组件. 安装 p ...

  4. 01_日志采集框架Flume简介及其运行机制

    离线辅助系统概览: 1.概述: 在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出. 任务调度等不可或缺的辅助系统,而这些辅助 ...

  5. 顺丰科技面试-java开发

    顺丰科技的面试官感觉人都挺随和,总共经历三面,两轮技术面,一轮hr面. 一.专业面一 主要是对着我的简历上的东西问,我的一个项目经历,两个实习上面以及自己提到会的技能展开的提问. (1)自我简介 (2 ...

  6. 用代理服务加快brew下载速度。方法:curl

    加快brew更新速度的方式:用代理 参考: https://www.zhihu.com/question/31360766常用的ss客户端都自带PAC模式的,比如ShadowsocksX-NG. 再次 ...

  7. Spark任务调度初识

    前置知识 spark任务模型 job:action的调用,触发了DAG的提交和整个job的执行. stage:stage是由是否shuffle来划分,如果发生shuffle,则分为2个stage. t ...

  8. c语言第一次作业1

    第一次作业 一 你对软件工程或者计算机科学与技术专业的了解是什么? 软件工程是一门研究用工程化方法构建和维护有效的,实用的和高质量的软件的学科,涉及程序语言设计,数据库,软件开发工具,系统平台,设计模 ...

  9. django缓存--缓存加数据库型

    4.缓存+数据库Session 数据库用于做持久化,缓存用于提高效率   a. 配置 settings.py       SESSION_ENGINE = 'django.contrib.sessio ...

  10. 记录 vant Picker 选择器,实现三级联动,传对应省市区code值

    最近使用vant UI写移动端,感觉还不错 功能挺全的,带的还有省市区三级联动. 但是 突然遇到一个 产品要传的 省市区的code码,还和vant的 邮编不一样,我*****. 看了一下vant UI ...