Python装饰器教程展示了如何在Python中使用装饰器基本功能。

1 使用教程

Python函数是一等公民。这意味着函数与Python中的其他对象具有同等的状态。可以将函数分配给变量,存储在集合中,动态创建和删除或作为参数传递。嵌套函数也称为内部函数,指的是在另一个函数中定义的函数。
Python decorator扩展并修改可调用函数的行为,而不修改可调用函数本身。decorator是修饰(或包装)其他函数并在包装函数运行前后执行代码的函数。Python装饰器通常用于日志记录,身份验证和授权,计时和缓存中。

1.1 Python装饰器简单示例

在这个示例中,简单创建一个简单的装饰器示例。

# 以函数作为参数
def enclose(fun): # wrapper*()用星好装饰传递过来的函数,将返回包装函数。
def wrapper(): print("***************************")
fun()
print("***************************")
# 返回包装函数
return wrapper # 这是要装饰的常规函数
def myfun():
print("myfun") # enclose()函数是类似decorator,它通过在输出中添加星形符号来扩展myfun函数的输出。
# myfun被传递给enclosure()函数,在该函数中对其进行了扩展。将返回并调用包装函数。
enc = enclose(myfun)
# 调用包装函数
enc()
***************************
myfun
***************************

1.2 带@符号的Python装饰器

Python允许使用@符号来标记要用decorator装饰的方法。从功能上讲,该示例与上一个示例相同。仅使用不同的语法。

def enclose(fun):

    def wrapper():

        print("***************************")
fun()
print("***************************") return wrapper # @enclose 就是enc = enclose(myfun)简写
# 表明调用enclose函数修饰myufun函数,并返回修饰函数
@enclose
def myfun():
print("myfun") myfun()
***************************
myfun
***************************

1.3 用参数修饰函数

下面的示例演示如何装饰带有参数的函数。

def enclose(fun):

    def wrapper(val):

        print("***************************")
fun(val)
print("***************************") return wrapper @enclose
def myfun(val):
print(f"myfun with {val}") myfun('falcon')
***************************
myfun with falcon
***************************

以下例子展示了如何使用*args,**kwargs语法处理可变数量的参数。

def enclose(fun):

    def wrapper(*args, **kwargs):

        print("***************************")
fun(*args, **kwargs)
print("***************************") return wrapper @enclose
def myfun(name, age):
print(f'{name} is {age} years old') myfun(name='Peter', age=32)
myfun('Roman', 29)
***************************
Peter is 32 years old
***************************
***************************
Roman is 29 years old
***************************

1.4 Python装饰器修改数据

decorator函数可以修改修饰函数的数据。

def uppercase(fun):

    # 在包装函数内部,修改并返回了文本
def wrapper(): res = fun()
modified = res.upper() return modified
return wrapper # @uppercase decorator将返回的文本更改为大写
@uppercase
def gen_message():
return 'Hello there!' msg = gen_message()
print(msg)
HELLO THERE!

1.5 Python多层装饰器

可以在一个函数上应用多个装饰器。以下示例在文本上应用了两个HTML标签。

def strong(fun):

    def wrapper():
return f'<strong>{fun()}</strong>'
return wrapper def em(fun): def wrapper():
return f'<em>{fun()}</em>' return wrapper # 先调用em装饰器,再调用strong装饰器
@strong
@em
def message():
return 'This is some message' print(message())
<strong><em>This is some message</em></strong>

1.6 Python装饰器计时示例

在下面的示例中,我们在函数上应用计时器装饰器。下面示例使用decorator计算factoria()函数运行的时间。

import time
import math def timer(func): def wrapper(*args, **kwargs): # 在函数运行之前,我们获得了开始时间。
begin = time.time() f = func(*args, **kwargs) # 获得结束时间
end = time.time()
print("Total time taken in : ", func.__name__, end - begin) return f return wrapper @timer
def factorial(num): return math.factorial(num) f = factorial(4580)
Total time taken in :  factorial 0.0005843639373779297

2 参考

http://zetcode.com/python/python-decorators/

[编程基础] Python装饰器入门总结的更多相关文章

  1. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  2. [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析

    python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...

  3. python -- 装饰器入门

    用例: 统计函数执行需要的时间 假设我们执行的一段代码的运行时间比我们预想的时间要久,而这段代码块有多个函数调用组成,我们有理由相信至少是其中的一个函数调用导致整个代码块产生了瓶颈.我们如何去发现导致 ...

  4. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  5. [python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析

    带参数的装饰器理解无非记住两点: 1.本质不过在基本的装饰器外面再封装一层带参数的函数 2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认 ...

  6. python装饰器入门

    按别人的教程弄的. 要清楚基于类和基于函数的实现的不同之处. #!/usr/bin/env python # -*- coding: utf-8 -*- ''' class entryExit(obj ...

  7. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  8. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  9. 【转】Python装饰器与面向切面编程

    原文请参考: http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切 ...

随机推荐

  1. 谣言检测()《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》

    论文信息 论文标题:Data Fusion Oriented Graph Convolution Network Model for Rumor Detection论文作者:Erxue Min, Yu ...

  2. 一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机,TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用

    一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机.海尔空调等,TCL工厂可以生产TCL电视机,TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用 ...

  3. 银行ATM存取款系统(C语言实现)

    这里使用的运行工具是DEV C++.老铁们一定要看仔细了.是DEV C++ 仅供借鉴:这个是大一时期写的.大四的时候整理了一下(本人C语言学的也不太好).肯定很多不足和存在漏洞的地方.仅供借鉴.仅供借 ...

  4. 《Java并发编程的艺术》读书笔记:一、并发编程的目的与挑战

    发现自己有很多读书笔记了,但是一直都是自己闷头背,没有输出,突然想起还有博客圆这么个好平台给我留着位置,可不能荒废了. 此文读的书是<Jvava并发编程的艺术>,方腾飞等著,非常经典的一本 ...

  5. Tensorflow Lite从入门到精通

    TensorFlow Lite 是 TensorFlow 在移动和 IoT 等边缘设备端的解决方案,提供了 Java.Python 和 C++ API 库,可以运行在 Android.iOS 和 Ra ...

  6. offset新探索:双管齐下,加速大数据量查询

    摘要:随着offset的增加,查询的时长也会越来越长.当offset达到百万级别的时候查询时长通常是业务所不能容忍的. 本文分享自华为云社区<offset新探索:双管齐下,加速大数据量查询> ...

  7. 十、Pod的init containers

    Pod 的 init Containers Pod 我们可以分为两类,一种属于自主式 Pod ,还有一种属于控制器管理的 Pod . 一.Pod 的 initContainers 基本概念: ​Pod ...

  8. 京东云开发者|关于“React 和 Vue 该用哪个”我真的栓Q

    一.前言:我全都要 面对当今前端界两座大山一样的主流框架,React和Vue,相信很多小伙伴都或多或少都产生过这样疑问,而这样的问题也往往很让人头疼和犹豫不决: 业务场景中是不是团队用什么我就用什么? ...

  9. Codeforces 1670 E. Hemose on the Tree

    题意 给你个数p,n = 2^p: 有一棵树有n个节点,告诉你怎么连边: 每个点有个权值,每条边也有个权值,权值需要自行分配,[1,2,3..n...2n-1],总共2n-1个权值: 你需要选一个节点 ...

  10. Spring Boot:自定义 Whitelabel 错误页面

    一.概述在本文中,我们将研究如何禁用和自定义 Spring Boot 应用程序的默认错误页面,因为正确的错误处理描述了专业性和质量工作. 2.禁用白标错误页面 首先,让我们看看如何通过将server. ...