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)

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

原文地址:https://www.cnblogs.com/hua888/p/10436288.html

时间: 2024-08-12 10:08:21

python装饰器带括号和不带括号的语法和用法的相关文章

python 装饰器 一 (简单不带参数的函数)

#coding=utf-8 #python 装饰器 '''     装饰器可以用def的形式来定义.装饰器接收一个可调用对象作为输入参数, 并返回一个新的可调用对象. 装饰器新建了一个可调用对象,也就是return 返回的函数funx, 在新增的函数中,可以添加我们需要的功能,并通过调用原有函数来实现原有函数的功能 ''' def deco(func):     '''         无参数装饰器,func为被装饰的函数     '''     def _deco():         pri

python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func):     def _deco():         print("before myfunc() called.")         func(

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

Python装饰器的学习笔记(转载)

Python装饰器的学习笔记 2017-05-18 程序员共读 来自:标点符的<Python装饰器的学习笔记> 链接:http://www.biaodianfu.com/python-decorator.html 原文:http://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators-in-python#answer-1594484 装饰器(decorator)是一种高级Python语法.可

python装饰器装饰原理探秘

最近一直没抽出时间来写博客,这篇博客在草稿箱里面躺了好久了,一直都只有一个标题. 现在终于要开始写了. 为什么要写这个篇文章 前段时间整天盯着python学习 群,发现好多同学对python很多内容并不是很理解,觉得有必要分享自己这段时间通过学习实践总结出来的一些东西. 写的过程中我会将一些自己理解的内容直接用文字写出来,感觉没必要去复制粘贴一些概念性的东西,若存在有理解错误的地方,欢迎各位在留言指出一起讨论提高,SO 废话不说开写吧. 什么是装饰器 装饰器(Decorator):个人理解装饰器

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方

Python装饰器完全解读

1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python. 2 初步理解装饰器 2.1 什么是装饰器 在解释什么是装饰器之前,我们有必要回顾一下Python中的一些思想和概念.我们都知道,Python是一门面向对象的语言,Python基本思想就是一些皆对象,数据类型是对象.类是对象.类实例也是对象……对于接下来我们要说的装饰器而言,最重要的是,函数也是对象! 你没看错,函

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")