首页 > 编程语言 >python基础__装饰器(修饰器)

python基础__装饰器(修饰器)

时间:2022-08-27 14:25:24浏览次数:55  
标签:__ return log python 修饰 func print def 函数

装饰器处理逻辑

当解释器读到@装饰符,会先解析@下一行的内容,把下一行的函数或者类作为@后边的函数的参数,执行被装饰的函数。

例子1:被修饰函数不带参数

 1 def log(func):
 2     def wrapper():
 3         print('log开始 ...')
 4         func()
 5         print('log结束 ...')
 6     return wrapper
 7 
 8 @log
 9 def test():
10     print('test ..')
11 
12 test()

例子2:被修饰函数带参数

 1 from functools import wraps
 2 def log(func):
 3     @wraps(func)
 4     def wrapper(*args,**kwargs):
 5         print('log开始 ...',func.__name__)
 6         ret = func(*args,**kwargs)
 7         print('log结束 ...')
 8         return ret
 9     return wrapper
10     
11 @log
12 def test1(s):
13     print('test1 ..', s)
14     return s
15 
16 @log
17 def test2(s1, s2):
18     print('test2 ..', s1, s2)
19     return s1 + s2
20 
21 test1('a')
22 test2('a','bc')

例子3:修饰符带参数,需要比上面例子多一层包装

 1 from functools import wraps
 2 
 3 def log(arg):    
 4     def _log(func):
 5         @wraps(func)
 6         def wrapper(*args,**kwargs):
 7             print('log开始 ...',func.__name__, arg)            
 8             ret = func(*args,**kwargs)
 9             print('log结束 ...')
10             return ret
11         return wrapper
12     return _log
13  
14 @log('module1')
15 def test1(s):
16     print('test1 ..', s)
17     return s
18 
19 @log('module1')
20 def test2(s1, s2):
21     print('test2 ..', s1, s2)
22     return s1 + s2
23 
24 
25 test1('a')
26 test2('a','bc')

 

在函数定义中我们返回函数,为什么是函数名,而不是函数名()?

这是因为当把一对小括号放在后面,这个函数就会执行;如果不放括号在函数后面,那函数可以被到处传递,并且可以赋值给别的变量而不去执行它。

 

 

 

中国人的人生意义可以用一个具体的词来形容:牵挂!

当你离开这个世界的时候,心中满是自己牵挂的人和事,如果一个人了无牵挂,那这个人也是不怕死的。

 

标签:__,return,log,python,修饰,func,print,def,函数
From: https://www.cnblogs.com/lzcnblogs/p/16630451.html

相关文章

  • android 动态添加 fragment
    按钮点击触发:publicvoidexecute(Viewview)throwsException{FragmentManagerfm=getFragmentManager();FragmentTransactionft=fm.beginT......
  • redis-主从复制
    一、主从复制的建立1.在slave机器上运行replicaofmaster的ipmaster的ip(Redis5.0之前使用slaveof)2.启动redis时redis-server/etc/redis.conf--replicaof192.168.......
  • Apple开发_字符串与Unicode编码的互转
    //字符串转Unicode-(NSString*)utf8ToUnicode:(NSString*)string{NSUIntegerlength=[stringlength];NSMutableString*str=[NSMutableStringstrin......
  • js笔记整理2
    对象及日期定时器日期对象的定义(使用new关键词)1.获取当前的时间(本地的时间)vardate=newDate()//不传参就是获取当前时间2.获取指定的时间vardate=newDate(......
  • Java·初篇 01认识第一个程序
    Java·初篇01认识第一个程序一、前期准备【环境搭建】(https://www.java.com/zh-CN/)了解JRE和JDKJDK的下载和按照【常用DOS命令】目的:使用JDK,在bin目录中编译ja......
  • 关于qtableview开发过程中的一些记录
    使用QTableWidget刷新数据后,经常会自动展示为table首行。为了显示刷新数据前所在的位置,解决办法如下:     先记住滚动条位置,刷新数据后,再重置滚动条位置。伪代码如......
  • DataContext使用事务
    1//必须打开连接,用于事务的创建2if(db.Connection.State==ConnectionState.Closed)db.Connection.Open();3using(DbTrans......
  • vue组件中的data为什么是一个函数?
    为什么data为什么是一个函数而不是一个对象?原因是因为如果data是一个对象的话,两个组件中设置的data都会引用同一个内存地址,而用函数的话,则会在每次引用的时候返回一个新的......
  • R语言中 %||%什么意思?
     001、%||%函数用于判断左侧变量是否为NULL,如果左侧为NULL,则返回右侧的变量;否则,返回左侧的变量 library(rlang)x=NULLy=10x%||%y##左侧变量x......
  • dragonfly 蜻蜓算法 学习笔记
    1、GettingStated1.1CommandLine使用方法:在pycharm中:cdexamplepython..\bin\dragonfly-script.py--configxxx.json--optionxxx.txt1)BasicUse全局优化......