python中的装饰器,函数带参数的装饰器,带类参数的装饰器

2024-08-31 20:58

本文主要是介绍python中的装饰器,函数带参数的装饰器,带类参数的装饰器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

其实,python 中的装饰器本质上就是一个函数,这个函数接收其他的函数作为参数,并将其以一个全新的修改后的函数替换它
关于装饰器的知识是python面试中比较常见的,对于装饰器的理解可以看这篇文章:理解Python中的装饰器,理解之后,再手写一遍下面的8种装饰器加深理解以后使用就更轻松多了!

1.最简单的函数

def myfunc()print "i am a function"myfunc()

2.初步了解装饰函数的调用结构

在函数执行前和执行后分别计时,打印函数运行消耗的时间

import datetime
import time
def out(fun):start = datetime.datetime.now()fun()end = datetime.datetime.now()print (end-start)return fun
def inner():time.sleep(1)print ("i am inner func")myfunc = outmyfunc(inner)

3.尝试引用@语法糖来调用装饰函数

import datetime,time
def out(func):start =datetime.datetime.now()func()end = datetime.datetime.now()print(end-start)return func@out
def myfunc():time.sleep(1)print("zhangkun inner")

4.使用内嵌的包装函数

使用内嵌包装函数来确保每次新函数都被调用,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象

import datetime,timedef out(func):def inner():start = datetime.datetime.now()func()end = datetime.datetime.now()print(end-start)print("out and inner")return inner@out
def myfunc():time.sleep(1)print("zhangkun")myfunc()

5.对带参数的函数使用装饰器

内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象

import datetime,timedef out(func):def inner(*args):start = datetime.datetime.now()func(*args)end = datetime.datetime.now()print(end-start)print("out and inner")return inner@out
def myfunc(*args):time.sleep(1)print("args is{}".format(args))myfunc("lalalal")

6.给装饰器参数

和上一示例相比在外层多了一层包装

#coding:utf-8
def outermost(*args):def out(func):print ("装饰器参数{}".format(args))def inner(*args):print("innet start")func(*args)print ("inner end")return innerreturn out@outermost(666)
def myfun(*args):print ("试试装饰器和函数都带参数的情况,被装饰的函数参数{}".format(args))myfun("zhangkun")

7.带类参数的装饰器

class locker:def __init__(self):print("locker.__init__() should be not called")@staticmethoddef acquire():print("locker.acquire() static method be called")@staticmethoddef release():print("locker.release() static method be called")def outermost(cls):def out(func):def inner():cls.acquire()func()cls.release()return innerreturn out@outermost(locker)
def myfunc():print("myfunc called")myfunc()

8.对一个函数应用多个装饰器

class mylocker:def __init__(self):print("mylocker.__init__() called.")@staticmethoddef acquire():print("mylocker.acquire() called.")@staticmethoddef unlock():print("  mylocker.unlock() called.")class lockerex(mylocker):@staticmethoddef acquire():print("lockerex.acquire() called.")@staticmethoddef unlock():print("  lockerex.unlock() called.")def lockhelper(cls):def _deco(func):def __deco2(*args, **kwargs):print("before %s called." % func.__name__)cls.acquire()try:return func(*args, **kwargs)finally:cls.unlock()return __deco2return _decoclass example:@lockhelper(mylocker)@lockhelper(lockerex)def myfunc2(self, a, b):print(" myfunc2() called.")print(a+b)a = example()
a.myfunc2(1,2)

9.作为一个类

虽然装饰器几乎总是可以用函数实现,但是在某些情况下,使用用户自定义的类可能会更好,如果装饰器需要复杂的参数化或者依赖特定状态,那么这种说法往往是对的
非参数化装饰器用作类的通用模式如下

class DerocatorAsClass:def __init__(self,funcation):self.funcation = funcationdef __call__(self, *args, **kwargs):# 调用函数之前,做点什么result = self.funcation(*args,**kwargs)# 在调用之后做点什么并且返回结果return result

这篇关于python中的装饰器,函数带参数的装饰器,带类参数的装饰器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124977

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空