广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python装饰器入门学习教程(九步学习)
  • 690
分享到

Python装饰器入门学习教程(九步学习)

入门教程Python 2022-06-04 19:06:06 690人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

装饰器(decorator)是一种高级python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数

装饰器(decorator)是一种高级python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。

这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。

第一步:最简单的函数,准备附加额外功能


# -*- coding:gbk -*-
'''示例1: 最简单的函数,表示调用了两次'''
def myfunc():
print("myfunc() called.")
myfunc()
myfunc() 

第二步:使用装饰函数在函数执行前和执行后分别附加额外功能


# -*- coding:gbk -*-
'''示例2: 替换函数(装饰)
装饰函数的参数是被装饰的函数对象,返回原函数对象
装饰的实质语句: myfunc = deco(myfunc)'''
def deco(func):
print("before myfunc() called.")
func()
print(" after myfunc() called.")
return func
def myfunc():
print(" myfunc() called.")
myfunc = deco(myfunc)
myfunc()
myfunc() 

第三步:使用语法糖@来装饰函数


# -*- coding:gbk -*-
'''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”
但发现新函数只在第一次被调用,且原函数多调用了一次'''
def deco(func):
print("before myfunc() called.")
func()
print(" after myfunc() called.")
return func
@deco
def myfunc():
print(" myfunc() called.")
myfunc()
myfunc() 

第四步:使用内嵌包装函数来确保每次新函数都被调用


# -*- coding:gbk -*-
'''示例4: 使用内嵌包装函数来确保每次新函数都被调用,
内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
def deco(func):
def _deco():
print("before myfunc() called.")
func()
print(" after myfunc() called.")
# 不需要返回func,实际上应返回原函数的返回值
return _deco
@deco
def myfunc():
print(" myfunc() called.")
return 'ok'
myfunc()
myfunc() 

第五步:对带参数的函数进行装饰


# -*- coding:gbk -*-
'''示例5: 对带参数的函数进行装饰,
内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
def deco(func):
def _deco(a, b):
print("before myfunc() called.")
ret = func(a, b)
print(" after myfunc() called. result: %s" % ret)
return ret
return _deco
@deco
def myfunc(a, b):
print(" myfunc(%s,%s) called." % (a, b))
return a + b
myfunc(1, 2)
myfunc(3, 4) 

第六步:对参数量不确定的函数进行装饰


# -*- coding:gbk -*-
'''示例6: 对参数数量不确定的函数进行装饰,
参数用(*args, **kwargs),自动适应变参和命名参数'''
def deco(func):
def _deco(*args, **kwargs):
print("before %s called." % func.__name__)
ret = func(*args, **kwargs)
print(" after %s called. result: %s" % (func.__name__, ret))
return ret
return _deco
@deco
def myfunc(a, b):
print(" myfunc(%s,%s) called." % (a, b))
return a+b
@deco
def myfunc2(a, b, c):
print(" myfunc2(%s,%s,%s) called." % (a, b, c))
return a+b+c
myfunc(1, 2)
myfunc(3, 4)
myfunc2(1, 2, 3)
myfunc2(3, 4, 5) 

第七步:让装饰器带参数


# -*- coding:gbk -*-
'''示例7: 在示例4的基础上,让装饰器带参数,
和上一示例相比在外层多了一层包装。
装饰函数名实际上应更有意义些'''
def deco(arg):
def _deco(func):
def __deco():
print("before %s called [%s]." % (func.__name__, arg))
func()
print(" after %s called [%s]." % (func.__name__, arg))
return __deco
return _deco
@deco("mymodule")
def myfunc():
print(" myfunc() called.")
@deco("module2")
def myfunc2():
print(" myfunc2() called.")
myfunc()
myfunc2() 

第八步:让装饰器带 类 参数


# -*- coding:gbk -*-
'''示例8: 装饰器带类参数'''
class locker:
def __init__(self):
print("locker.__init__() should be not called.")
@staticmethod
def acquire():
print("locker.acquire() called.(这是静态方法)")
@staticmethod
def release():
print(" locker.release() called.(不需要对象实例)")
def deco(cls):
'''cls 必须实现acquire和release静态方法'''
def _deco(func):
def __deco():
print("before %s called [%s]." % (func.__name__, cls))
cls.acquire()
try:
return func()
finally:
cls.release()
return __deco
return _deco
@deco(locker)
def myfunc():
print(" myfunc() called.")
myfunc()
myfunc() 

第九步:装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器


# -*- coding:gbk -*-
'''mylocker.py: 公共类 for 示例9.py'''
class mylocker:
def __init__(self):
print("mylocker.__init__() called.")
@staticmethod
def acquire():
print("mylocker.acquire() called.")
@staticmethod
def unlock():
print(" mylocker.unlock() called.")
class lockerex(mylocker):
@staticmethod
def acquire():
print("lockerex.acquire() called.")
@staticmethod
def unlock():
print(" lockerex.unlock() called.")
def lockhelper(cls):
'''cls 必须实现acquire和release静态方法'''
def _deco(func):
def __deco(*args, **kwargs):
print("before %s called." % func.__name__)
cls.acquire()
try:
return func(*args, **kwargs)
finally:
cls.unlock()
return __deco
return _deco 
# -*- coding:gbk -*-

'''示例9: 装饰器带类参数,并分拆公共类到其他py文件中

同时演示了对一个函数应用多个装饰器'''


from mylocker import *
class example:
@lockhelper(mylocker)
def myfunc(self):
print(" myfunc() called.")
@lockhelper(mylocker)
@lockhelper(lockerex)
def myfunc2(self, a, b):
print(" myfunc2() called.")
return a + b
if __name__=="__main__":
a = example()
a.myfunc()
print(a.myfunc())
print(a.myfunc2(1, 2))
print(a.myfunc2(3, 4)) 

以上给大家分享了Python装饰器入门学习教程(九步学习),希望对大家有所帮助。

--结束END--

本文标题: Python装饰器入门学习教程(九步学习)

本文链接: https://www.lsjlt.com/news/15458.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python装饰器入门学习教程(九步学习)
    装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数...
    99+
    2022-06-04
    入门 教程 Python
  • Python画图学习入门教程
    本文实例讲述了Python画图的基本方法。分享给大家供大家参考,具体如下: Python:使用matplotlib绘制图表 python绘制图表的方法,有个强大的类库matplotlib,可以制作出高质量的...
    99+
    2022-06-04
    画图 入门教程 Python
  • Python学习入门基础教程(learn
     在Python里可以自定义函数,实现某特定功能,这里首先要区分一下函数的定义和函数的调用两个基本概念,初学者往往容易混淆。      函数的定义是指将一堆能实现特定功能的语句用一个函数名标识起来,而函数的调用则是通过函数名来使用这一堆语句...
    99+
    2023-01-31
    基础教程 入门 Python
  • Python学习入门基础教程(lear
      在if分支判断语句里的条件判断语句不一定就是一个表达式,可以是多个(布尔)表达式的组合关系运算,这里如何使用更多的关系表达式构建出一个比较复杂的条件判断呢?这里需要再了解一下逻辑运算的基础知识。逻辑关系运算有以下几种运算符.     ...
    99+
    2023-01-31
    基础教程 入门 Python
  • Kotlin入门学习教程之可见性修饰符
    目录前言1、包场景下的可见性修饰符2、类内部声明的成员总结前言 在Kotlin中四种可见性修饰符:private、protected、internal、public,如果没有显示指定...
    99+
    2022-11-12
  • MyBatis入门学习教程-MyBatis快速入门
    目录Mybatis一、快速开始1、创建 Maven 项目3、配置 Maven 插件4、新建数据库,导入表格5、编写 Mybatis 配置文件6、编写实体类7、编写 mapper 接口...
    99+
    2022-11-12
  • Python多线程入门学习
    Python 中使用线程有两种方式:函数或者用类来包装线程对象。 函数式: 调用 thread 模块中的start_new_thread()函数来产生新线程。 语法如下: thr...
    99+
    2022-11-12
  • 深入学习Python中的装饰器使用
    装饰器 vs 装饰器模式 首先,大家需要明白的是使用装饰器这个词可能会有不少让大家担忧的地方,因为它很容易和设计模式这本书里面的装饰器模式发生混淆。曾经一度考虑给这个新的功能取一些其它的术语名称,但是装饰器...
    99+
    2022-06-04
    Python
  • Vue + OpenLayers 快速入门学习教程
    Openlayers 是一个模块化、高性能并且功能丰富的WebGIS客户端的JavaScript包,用于显示地图及空间数据,并与之进行交互,具有灵活的扩展机制。 简单来说,使用 O...
    99+
    2022-11-12
  • Python基础学习教程_Python学习路线_我是Python小白,怎么入门Python
    Python基础学习教程_Python学习路线_我是Python小白,怎么入门Python人生苦短,我用Python!!!短短几个字,现在在各大编程学习类平台随处可见,短短几个字,足以见Python今日的地位!为什么Python总被提起,为...
    99+
    2023-06-02
  • python基础学习12----装饰器
    装饰器可以在不修改目标函数代码的前提下, 在目标函数执行前后增加一些额外功能 例如有一个简单的函数 import time def func1(): print("这是一个简单的函数") time.sleep(2) 想给这...
    99+
    2023-01-30
    基础 python
  • python学习系列之python装饰器
    一、常规的装饰器,比如 @auth,执行2步操作:1、执行auth函数,并传参func进来2、获取返回值,并赋值给被装饰器的函数的函数名(如让fetch_server_list等于返回值)二、而带参数的装饰器,比如 @auth(before...
    99+
    2023-01-31
    系列之 python
  • ThinkPHP6.0学习入门:环境搭建与安装教程
     ThinkPHP6.0的环境要求如下: PHP >= 7.1.06.0版本开始,ThinkPHP必须通过Composer方式安装和更新。 环境搭建: 可使用phpEnv软件快捷生成TP6所需的集成环境,包含了PHP7.4语言,Apache...
    99+
    2023-09-07
    php 改行学it
  • 机器学习教程,Python3天快速入门机
    人工智能,现今已经是好多程序员都想学习的技能,毕竟人工智能这么火,对不对?你是否也想学习呢?今天就分享一个机器学习教程,Python3天快速入门机器学习! 该课程是机器学习的入门课程,主要介绍一些经典的传统机器学习算法,如分类算法:KNN算...
    99+
    2023-01-31
    入门 机器 快速
  • python深度学习tensorflow入门基础教程示例
    目录正文1、编辑器2、常量3、变量4、占位符5、图(graph)例子1:hello world例子2:加法和乘法例子3:矩阵乘法正文 TensorFlow用张量这种数据结构来表示所有...
    99+
    2022-11-11
  • Python学习教程:前后端分离开发入门
    今天的Python学习教程跟大家讲讲关于:前后端分离开发入门的相关内容!在传统的Web应用开发中,大多数的程序员会将浏览器作为前后端的分界线。将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数据准备的所有...
    99+
    2023-06-02
  • Python机器学习入门(一)序章
    目录前言写在前面1.什么是机器学习?1.1 监督学习1.2无监督学习2.Python中的机器学习3.必须环境安装Anacodna安装总结前言 每一次变革都由技术驱动。纵观人类历史,上...
    99+
    2022-11-12
  • Android的HTTP类库Volley入门学习教程
    1. 什么是Volley 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中...
    99+
    2022-06-06
    HTTP 学习 volley 教程 Android
  • Pytorch学习笔记DCGAN极简入门教程
    目录1.图片分类网络2.图片生成网络首先是图片分类网络:重点是生成网络每一个step分为三个步骤:1.图片分类网络 这是一个二分类网络,可以是alxnet ,vgg,resnet任何...
    99+
    2022-11-12
  • React组件化学习入门教程讲解
    目录模块化模块模块化组件化组件组件化函数式组件创建函数组件Props参数传递(重点)复合函数组件类式组件创建实例用户自定义组件模块化 模块 理解:向外提供特定功能的js程序,一般就是...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作