当前位置: 首页 > news >正文

python的装饰器

装饰器

1.装饰器基本概念
装饰器是Python语言的一个高级特性,它允许我们在代码运行期间动态地修改函数或者类的行为。通俗来说,装
饰器就是一个函数(或类),接受一个函数作为参数,并返回另一个函数。
2.装饰器应用场景
装饰器广泛应用于Python的函数和方法之上,可以用来实现很多有趣的功能。以下是一些典型的装饰器应用场景
3.装饰器的编写方法
# 定义一个装饰器my_decorator,并将其应用到函数say_hello
def my_decorator(func):
def wrapper():
print("执行函数前...")
func()
print("执行函数后...")
return wrapper
@my_decorator
def say_hello():
print("Hello, world!")
my_decorator就是一个简单的装饰器,它接受一个函数作为参数,并返回一个新的函数wrapper在函数say_hello上加上装饰器@my_decorator之后,实际上相当于执行了以下代码:
say_hello = my_decorator(say_hello)
原本的say_hello函数被替换成了装饰器返回的新函数wrapper,并且在执行say_hello()时,会先执行my_decorator函数中的代码(即“执行函数前...”),再执行原本的say_hello函数,最后再执行my_decorator函数中的另一段代码(即“执行函数后...”)。
记录日志:在函数调用前后打印相关的日志信息;
定时器:统计函数调用所花费的时间,以便进行性能分析;
缓存数据:将函数的计算结果缓存起来,避免重复计算;
输入合法性检查:检查函数输入参数的类型和取值范围是否合法;
授权验证:检查用户是否已经登录或者是否具备相应的权限等
装饰器的编写 方法非常简单,就是定义一个“闭包函数”,接收一个函数作为参数,并返回一个新的函数对象。如果需要装饰带参数的函数,则需要在包裹函数内部嵌套一个内层函数,用于接收函数数。
4.装饰器的注意事项
5.常见的内置装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__}执行时间:{end_time - start_time:.2f}s")
return result
return wrapper
@timer
def test_func(n):
return sum(range(n))
test_func(1000000)
# 定义了一个装饰器timer,它可以记录函数调用的执行时间,并在输出结果前后显示相关信息。在函数
test_func上添加装饰器之后,即可得到带有计时功能的新函数对象
装饰器的名称应当反映其实际作用,以便于他人理解和维护;
装饰器应该使用functools模块的wraps函数,以保留原函数的名称、文档字符串和注释等信息;装饰器可以链式调用(即装饰器装饰器),但在使用多个装饰器时,应确保它们的执行顺序和期望一致;装饰器可以接受参数,但需要在包裹函数内部再定义一个嵌套函数来接收参数;
对于类方法的装饰器,在定义时要将第一个参数设置为self或者cls,否则会出现类型错误;
在使用装饰器时,被装饰的函数必须先于装饰器定义,否则会出现“name ‘func_name’ is not
defined”的异常
@staticmethod:将函数定义为静态方法,无需实例化就可以直接调用;
@classmethod:将函数定义为类方法,第一个参数为类本身,可以通过类名或者实例调用;
@property:将函数定义为属性方法,可以像访问属性一样读取和设置函数返回值。
class MyClass:
def __init__(self, value):
self._value = value
6.小结
@staticmethod
def static_method():
print("这是一个静态方法")
@classmethod
def class_method(cls):
print(f"这是一个类方法,当前类名为{cls.__name__}")
@property
def value(self):
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
my_obj = MyClass( 10)
MyClass.static_method()
MyClass.class_method()
print(my_obj.value)
my_obj.value = 20
print(my_obj.value)
定义了一个MyClass类,并将其中的func1和func2方法分别使用了@staticmethod和@classmethod装饰器,以及将_value属性转化为了value属性,并使用@property和@value.setter装饰器进行了设置。需要注意的是,在访问value属性时,不需要加上括号。
装饰器是Python语言的一个高级特性,可以用于扩展函数、方法和类等对象的功能。
它具有简洁、灵活、易于复用等特点,可以很方便地实现很多常见的编程需求。
同时,在使用装饰器时,也需要注意一些细节问题,如装饰器的名称、顺序、参数等,以确保代码的可读性和正确性。

http://www.mrgr.cn/news/59305.html

相关文章:

  • 基于信号分解和多种深度学习结合的上证指数预测模型
  • 【HarmonyOS NEXT】每次升级二方库或三方库,工程都会报错
  • How to install Node.js and NPM on CentOS
  • 什么样的JSON编辑器才好用
  • Junit5中用Excel进行数据驱动
  • Linux:磁盘深潜:探索文件系统、连接之道与库的奥秘
  • 好/坏代码实例解读:图文并茂说明
  • 在MySQL中存储IP地址的最佳实践
  • C#判断带数字的字符串数组连续性的两种方式
  • 【JavaSE】认识String类,了解,进阶到熟练掌握
  • 使用 Resilience4j 实现重试
  • PHP模拟多继承的方式:traits
  • 数据结构 - 散列表,初探
  • Java篇图书管理系统
  • 深度图像和距离图像
  • 2024年如何学好JS
  • 多层感知机的从零实现与softmax的从零实现(真·0000零基础)
  • 2025前端面试-内存泄露-001
  • 软件模拟 SPI 时序,驱动OLED屏幕
  • 基于Python+Django的气象数据分析与可视化系统
  • 前端工程化面试题
  • asp.net core 入口 验证token,但有的接口要跳过验证
  • 尚硅谷-react教程-求和案例-@redux-devtools/extension 开发者工具使用-笔记
  • 工程项目管理软件怎么选?推荐7款实用工具
  • 越权漏洞概述
  • MinIO 完整使用案例