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

【python】装饰器

装饰器

  • python 语法特性,允许在不修改原函数代码的情况下,为函数添加新的功能
  • 接受一个函数作为参数,并返回一个新的函数

1. 装饰器表示方法

@装饰器函数
多个装饰器可以叠加使用

2. 装饰器类型

2.1 函数装饰器

2.1.1 基本函数装饰器
'''
将参数在装饰器中先执行,再利用执行后的结果做一些判断处理等
'''
def my_decorator(func):print("This is my_decorator")def wrapper():print("参数函数执行前")func()print("参数函数执行后")return wrapper@my_decorator
def my_func():print("This is my_func")my_func()
输出:
This is my_decorator
参数函数执行前
This is my_func
参数函数执行后
2.1.2 带参数的函数装饰器

函数带参数

def my_decorator2(func):print("This is test_1")def decorator(*args):print("args:", args) #(1,2,'a')func(*args)return decorator @my_decorator2
def my_func2(a,b,s):print("This is test_func")my_func2(1,2,'a')

装饰器与函数都带参数

def my_decorator3(param=None):print("This is my_decorator2, param:", param) #123def decorator(func):def wrapper(*args, **kwargs):print("参数函数执行前")print("传入参数:", args, kwargs) #(1,2) {'key':'value'}func(args, kwargs)print("参数函数执行后")return wrapperreturn decorator@my_decorator3(123) # 装饰器自身参数
def my_func3(*args, **kwargs):print("This is my_func2:", args, kwargs)my_func3(1, 2, key='value')

2.2 类装饰器

类作为装饰器

2.2.1 不带参数

'''
function timer 装饰器: 计算func函数执行时间
'''
class MyTimer:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):import timestart = time.time()result = self.func(*args, **kwargs)end = time.time()print(f"Function {self.func.__name__} took {end - start:.4f} seconds to execute.") # 运行函数锁花费的时间return result@MyTimer
def compute_square(n):total = 0for i in range(n):total += i * iprint("i:", i)print("total:", total)return totalcompute_square(3)
2.2.2 带参数
class Logger:def __init__(self, level="INFO"):self.level = leveldef __call__(self, func):def wrapper(*args, **kwargs):print(f"[{self.level}] Calling function: {func.__name__}")return func(*args, **kwargs) # 在调用带装饰器的函数时执行并返回结果return wrapper #在@装饰器应用时返回@Logger(level="DEBUG")
def sample_function(x, y):return x + y

2.3 方法装饰器(修饰类方法的装饰器)

def class_decorator(cls):def wrapper(*args, **kwargs):print(f"Creating instance of {cls.__name__} with args: {args}, kwargs: {kwargs}")instance = cls(*args, **kwargs)print(1111111111)return instanceprint(22222222)return wrapperclass MyClass:@class_decoratordef my_method(self):print("MyClass method called")cls = MyClass()
cls.my_method()'''
22222222
===main==
Creating instance of my_method with args: (<__main__.MyClass object at 0x7f1eca099790>,), kwargs: {}
MyClass method called
1111111111
yh@ubuntu:~/y
'''

2.4 内置装饰器(修饰类内部方法的装饰器)

2.4.1 @staticmethod

不用创建实例即可调用

class MyClass_test:@staticmethoddef my_func(): # 不带self参数,不需要通过具体实例调用print("MyClass method2 called")MyClass_test.my_func()
2.4.2 @classmethod

通过类直接调用

class MyClass:g_counter = 0def __init__(self):MyClass.g_counter += 1@classmethoddef get_instance_count(cls):return cls.g_counterMyClass.get_instance_count()
2.4.3

像访问属性一样使用

class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):return self._radius@radius.setterdef radius(self, value):if value < 0:raise ValueError("Radius cannot be negative")self._radius = value@propertydef area(self):return 3.14159 * (self._radius ** 2)cir = Circle(5)print("Radius:", cir.radius) # 像属性一样访问print ("Area:", cir.area)cir.radius = 10  # 使用setter方法更新半径print("Updated Radius:", cir.radius)

3 装饰器作用

  • 代码复用
  • 函数之前前条件验证
http://www.dtcms.com/a/558304.html

相关文章:

  • 培训计划--linux基础操作
  • 做一网站要什么时候开始企业网站的建设包括哪些
  • 023数据结构之线段树——算法备赛
  • 做化工回收的 做那个网站广东新闻发布会
  • 《信息系统项目管理师》2024 年上第 2 批次案例分析题及解析
  • 华为OD机试双机位A卷 - 插队 (C++ Python JAVA JS GO)
  • 裕华区建设局网站九天智能建站软件
  • 牛客101:递归/回溯
  • flash网站开源全国网站建设哪家专业
  • 网站整体克隆包含后台安卓app软件制作工具
  • 【Linux lesson3】进程概念
  • XPath语法及Python的lxml包学习
  • 网站管理系统源码怎么做网站icp备案
  • 生活视角下Prompt 提示词思考
  • 网站建设空间空间有几种类型成都电商网站
  • ROS2系列 (17) : Python服务通信实例实例——Server端
  • Windows 11 回退至windows 10
  • Pandas--数据读取与写入
  • 东莞seo网站优化方式毕业设计网站建设英文文献
  • 网站开发验收流程图网站建设渠道合作
  • 网站建设项目设计的图片做阿里巴巴怎么进公司网站
  • (N_158)基于微信小程序学生社团管理系统
  • html5经管网站模板企业oa管理系统
  • 【Kubernets】Kubernetes 资源类型大全:使用场景与配置示例
  • 成都哪里做网站如何做像京东淘宝那样的网站
  • 有没有建筑学做区位分析的网站淘宝联盟合作网站api
  • 《守正传艺:谷晟阳奇门遁甲教学的真实实践路径》
  • 网上家教网站开发网站首页原型图咋做
  • 数据结构==优先级队列与堆==
  • ⸢ 拾壹 ⸥⤳ 威胁感知与响应应用的实践案例