python装饰器带括号和不带括号的语法和用法

Posted hua888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python装饰器带括号和不带括号的语法和用法相关的知识,希望对你有一定的参考价值。

装饰器的写法补充:

通常装饰器的写法是@func(),而有的时候为了减少出错率,可能会写成@func,没有()括号,这时我们可以这样定义,来减少括号。下面通过两个例子还看。

一般装饰器的写法:
 1 def log(func=None):
 2     
 3     def inner(*args, **kwargs):
 4         print(do something before)
 5         res = func(*args, **kwargs)
 6         print(do something after)
 7         return rees
 8     
 9     return inner
10 
11 #使用装饰器
12 @log()
13 def my_func():
14     print(i am my_func)
15 
16 #运行这个函数
17 my_func()

 

运行结果:

1 do something before
2 i am my_func
3 do something after

 

可以不带括号的装饰器写法

需要增加判断在函数内,用于判断使用装饰器的函数是否可以调用,以达到括号的自由写法

判断的装饰器写法

 1 def log(func=None):
 2     
 3     #需要再次嵌套一层装饰器,才可以供下面运行时使用
 4     def wrapper(fun)
 5         def inner(*args, **kwargs):
 6             print(do something before)
 7             res = fun(*args, **kwargs)
 8             print(do something after)
 9             return rees
10         
11         return inner
12     
13     #判断func(参数):
14     if func is None:
15         return wrapper
16         
17     #如果func是可以调用的函数    
18     elif callable(func):
19         return wrapper(func)
20     
21 
22 #使用装饰器的时候,两种写法都可以运行
23 
24 第一种不带括号:
25 @log
26 def my_func():
27     print(i am my_func)
28 
29 第二种带括号的:
30 @log()
31 def my_func():
32     print(i am my_func)
33 
34 
35 #运行这个函数
36 my_func()

 

两种方式的一样,运行结果:

1 do something before
2 i am my_func
3 do something after

 

不带括号的理解:

 

@log =>等同于 my_func = log(my_func)

带括号的理解:

@log() =>等同于 my_func = log()(my_func)

 

 

结论: 内嵌之后,可以增加判断条件,增加了装饰器的灵活性。

以上是关于python装饰器带括号和不带括号的语法和用法的主要内容,如果未能解决你的问题,请参考以下文章

装饰器的应用-装饰器带参数和不带参数

python 类带括号和不带括号的区别

带括号和不带括号的python断言

Python调用函数带括号和不带括号的区别

Python调用函数加括号和不加括号的区别

Python调用函数加括号和不加括号的区别