如何使用 Decorator 装饰器来增强类的功能并实现元编程?

装饰器可修饰类和方法,实现功能增强与元编程。通过类装饰器可自动添加repr方法、注册子类等;通过方法装饰器可实现计时、日志、权限控制等功能,结合functools.wraps可保留函数元信息,提升可维护性。

如何使用 decorator 装饰器来增强类的功能并实现元编程?

在 Python 中,装饰器(Decorator)不仅能修饰函数,还能用于类和方法,实现功能增强与元编程。通过装饰类或类中的方法,可以在不修改原始代码的前提下动态添加行为,比如日志记录、权限检查、性能监控等。

使用类装饰器增强类功能

类装饰器接收一个类作为参数,并返回一个新的类或修改后的类。这种方式适合在类定义时注入通用逻辑。

例如,为类自动添加一个 repr 方法:

def add_repr(cls): def __repr__(self): return f”{cls.__name__}({‘, ‘.join(f'{k}={v}’ for k, v in self.__dict__.items())})” cls.__repr__ = __repr__ return cls

@add_repr
class Person:
def init(self, name, age):
self.name = name
self.age = age

p = Person(“Alice”, 30)
print(p) # 输出: Person(name=Alice, age=30)

装饰类中的方法

更常见的是装饰类的特定方法,比如用装饰器实现计时、缓存或权限控制。

定义一个计时装饰器:

import time

def timer(func):
def wrapper(*args, *kwargs):
start = time.time()
result = func(
args, **kwargs)
duration = time.time() – start
print(f”{func.name} 执行耗时: {duration:.4f} 秒”)
return result
return wrapper

class DataProcessor:
@timer
def process(self):
time.sleep(1)
return “处理完成”

dp = DataProcessor()
dp.process() # 输出执行时间

结合元编程实现高级控制

装饰器可以访问类的属性和方法,实现类似元类的部分功能,但更简洁。比如自动注册子类,或验证类结构。

以下示例使用装饰器注册类到全局列表:

registry = []

def register(cls):
registry.append(cls)
return cls

@register
class ServiceA:
pass

@register
class ServiceB:
pass

print(registry) # [ServiceA, ServiceB]

这种模式常用于插件系统或框架中,自动发现可用组件。

使用 functools.wraps 保持函数元信息

在装饰类方法时,建议使用 functools.wraps 保留原方法的元数据,避免调试困难。

from functools import wraps

def logged(func):
@wraps(func)
def wrapper(*args, *kwargs):
print(f”调用 {func.name}”)
return func(
args, **kwargs)
return wrapper

class Calculator:
@logged
def add(self, a, b):
return a + b

这样 add.__name__ 仍为 ‘add’,而不是 ‘wrapper’。

基本上就这些。装饰器提供了一种清晰、可复用的方式来扩展类的行为,同时支持元编程场景下的自动化和结构控制。关键是理解装饰器如何在类创建过程中介入,并合理利用闭包和属性操作。

以上就是如何使用 Decorator 装饰器来增强类的功能并实现元编程?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1522652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何实现一个基于规则的自定义 ESLint 插件来统一团队代码风格?
上一篇 2025年12月20日 15:13:27
JavaScript中的移动端开发有哪些特殊考虑?
下一篇 2025年12月20日 15:13:42

相关推荐

  • 高德地图APP可以打车吗_高德地图APP打车功能使用教程

    打开高德地图APP,点击首页打车按钮,确认起点并输入目的地,选择车型后点击立即打车即可发起行程。2. 搜索目的地后进入路线规划,切换至打车模式,核对信息并下单。3. 使用助老模式可简化操作,支持现金支付。4. 需预约时可在打车页面设置未来时间,完成预约。 如果您需要在高德地图APP内快速叫车,但不确…

    2026年9月4日
    000
  • 如何在高德地图绑定快递地址

    在日常生活中,将快递地址与高德地图进行绑定,能够极大地方便我们的快件收发操作。接下来,就为大家详细介绍如何完成这一设置。 第一步,打开手机中的高德地图App。进入主界面后,点击屏幕左上角的个人头像图标,即可跳转至个人中心页面。 进入个人中心后,找到“我的地址”选项并点击进入。在此页面中,你会看到已保…

    2026年9月4日
    000
  • MAC的隔空投送(AirDrop)搜不到设备怎么办_MAC AirDrop搜不到设备解决方法

    首先检查设备Wi-Fi和蓝牙是否开启,并确保隔空投送设置为“所有人”或“仅限联系人”;接着重启所有设备以排除临时故障;若问题仍存在,尝试退出并重新登录iCloud账户以重置网络与同步状态;为进一步排查,可启动Mac安全模式以排除第三方软件干扰;最后通过创建新管理员账户判断是否为用户配置文件损坏所致。…

    2026年9月4日
    100
  • Win10锁屏壁纸在哪?Win10锁屏壁纸存放的位置

    Win10锁屏壁纸在哪?Win10锁屏壁纸存放的位置Win10锁屏壁纸在哪?Win10锁屏壁纸存放的位置Win10锁屏壁纸在哪?Win10锁屏壁纸存放的位置Win10锁屏壁纸在哪?Win10锁屏壁纸存放的位置

    win10无疑是目前非常流行的系统之一,但依然有不少朋友不清楚锁屏壁纸的具体存储位置。接下来就跟着小编的步伐,一起学习如何轻松定位win10锁屏壁纸所在的文件夹吧。 Win10锁屏壁纸存放位置解析 1、首先我们需要了解,win10系统默认将壁纸保存在“C:WindowsWebWallpaper”目录…

    2026年9月4日 用户投稿
    100
  • VSCode调试路径怎么写_VSCode配置调试工作目录与路径映射教程

    答案是通过在launch.json中正确配置cwd和路径映射字段。具体来说,program指定入口文件,cwd设置程序运行时的工作目录以确保相对路径正确,sourceMapPathOverrides或pathMappings则解决本地与远程/容器内路径不一致问题,从而实现断点命中和源码映射。排查时需…

    2026年9月4日
    000
  • 铁路12306APP如何通过查询获取票价信息_票价查询与费用明细查看方法

    打开铁路12306 APP,点击【我的】进入“出行向导”,选择【票价查询】,输入出发地、目的地和日期后点击查询,即可查看各席别公布票价及儿童票、学生票等明细,无需购票即可使用,建议使用最新版本以确保功能正常。 想在铁路12306 APP上查票价,操作很简单,不需要买票也能提前知道价格。打开APP后直…

    2026年9月4日
    000
  • 番茄小说书架满了怎么办_番茄小说书架管理清理指南

    书架满时可通过删除书籍、分类整理、清理缓存或迁移至其他平台解决。首先在编辑模式下批量删除书籍;接着按阅读频率和类型分类优化空间;再进入设置清理缓存提升性能;最后将部分书籍转移至微信读书等平台并同步账号,实现多设备管理。 如果您在使用番茄小说时发现书架已满,无法添加新的书籍,这通常是因为书架容量达到上…

    2026年9月4日
    000
  • Python如何批量读取CAD文件右下角的文字信息?

    Python高效批量处理CAD文件文字信息 本文介绍如何使用Python程序高效提取CAD文件右下角的文字信息,例如图号和工程名称。 解决方案: 如果您的CAD文件采用文本格式存储,建议您参考该格式的规范文档,并根据文档中定义的标准来解析数据,这将确保数据的准确性和可靠性。 立即学习“Python免…

    2026年9月4日
    200
  • 铁路12306车票改签可以换乘车人吗_铁路12306改签换乘车人规定

    可以更换乘车人,需在未改签且不变更到站的前提下,于开车当日24时前通过12306平台或车站窗口办理;新乘车人须完成实名认证或预核验,特殊票种需具备相应优惠资质。 如果您已经购买了火车票,但因行程变动需要更换乘车人,则可以通过改签操作来实现。铁路12306平台允许在特定条件下变更乘车人信息,但需遵守相…

    2026年9月4日
    000
  • 红果免费短剧怎么搜索演员找剧_红果免费短剧演员搜索教程

    可通过搜索框输入演员姓名、分类筛选中选择演员标签或从个人主页查看关联作品来查找红果免费短剧中演员参演的剧集。 如果您想在红果免费短剧中通过演员信息查找相关剧集,但不确定如何操作,可以通过平台提供的多种搜索方式快速定位目标内容。以下是具体的查找方法: 本文运行环境:小米14 Pro,Android 1…

    2026年9月4日
    000
  • Celery实现定时任务crontab

    Celery实现定时任务crontabCelery实现定时任务crontabCelery实现定时任务crontabCelery实现定时任务crontab

    定时任务在开发中应用广泛,几乎所有开发人员都会接触到。实现定时任务的方法有很多,其中celery的定时任务功能强大且使用简便,只需安装celery即可。以下是使用celery实现定时任务的详细步骤。 一. 搭建Celery定时任务架构 在项目中合适的位置新建一个定时任务目录 celery_cront…

    2026年9月4日 用户投稿
    100
  • [python]windows上安装pyaudio最简单方法

    pyaudio是一个用于处理音频流的python库,它依赖于portaudio库。如果直接使用pip命令无法安装pyaudio,可以尝试通过whl文件进行安装。以下是pyaudio通过whl文件安装的详细方法: 一、准备阶段 下载PyAudio的whl文件 访问可靠的Python包分发网站,如镜像站…

    2026年9月3日
    100
  • 如何批量读取CAD文件中右下角的角标数据(例如图号和工程名)?

    高效提取CAD图纸角标信息 本文介绍如何批量提取CAD文件(例如DXF或DWG格式)右下角的角标数据,如图号和工程名,从而简化项目文件管理。 Python程序员可以使用其强大的文本处理能力来实现此功能。 实现方法包括: 了解文件格式: 首先,需要熟悉CAD文件(DXF或DWG)的格式规范,理解其数据…

    2026年9月3日
    200
  • 高德地图如何分享我的实时位置_高德地图实时位置分享方法

    高德地图支持实时位置共享,可通过“位置共享”快速发起临时共享,设置时长并选择联系人;使用“家人地图”创建长期共享群组,便于家庭成员追踪位置;在导航时可分享实时路线至微信等平台,显示行进方向与预计到达时间;还可通过“群组”工具建立团队共享,适合多人协同定位,方便集合与行程协调。 如果您希望与亲友或同事…

    2026年9月3日
    200
  • 如何用Python批量提取CAD文件右下角的文字信息?

    Python高效批量提取CAD文件右下角文字信息 许多CAD文件都包含右下角的文字信息,例如图号、工程名称等。本文提供一种基于Python的解决方案,实现高效批量提取这些信息。 解决方案概述 本方案的核心在于理解CAD文件的结构和数据存储方式。通常,这些关键信息以标准格式存储,方便程序解析。 立即学…

    2026年9月3日
    200
  • 闪送机票优惠券领取入口_闪送机票优惠券领取方法

    首先确认是否已通过云闪付、航空公司官方渠道或电商平台成功领取优惠券,并确保满足使用条件,如地理位置、实名认证和指定支付方式等要求。 如果您在购买机票时发现无法使用优惠券,可能是由于未正确领取或未满足使用条件。以下是解决此问题的步骤: 本文运行环境:iPhone 15 Pro,iOS 18 一、通过云…

    2026年9月3日
    100
  • QQ邮箱登录通道 qq邮箱登录入口官网

    QQ邮箱登录通道在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ邮箱登录入口官网信息,感兴趣的网友一起随小编来瞧瞧吧! https://mail.qq.com 快速访问与多端同步 1、通过官网地址可直接进入登录界面,支持QQ账号一键登录,简化验证流程。 2、网页版界面布局清晰,收件箱、…

    2026年9月3日
    400
  • 猫眼如何设置观影提醒功能_猫眼电影观影提醒设置教学

    首先在猫眼购票后系统自动设置提醒,用户可开启观影前通知;其次未购票影片可通过详情页“提醒我”手动添加上映或排片提醒;再者支持将提醒同步至手机日历;最后需检查手机通知权限以确保接收。 如果您在猫眼电影App中购买了电影票或想提前获取即将上映影片的提醒服务,可以通过设置观影提醒功能来获得场次、时间以及影…

    2026年9月3日
    100
  • 喵特app账号注销步骤

    喵特app账号注销步骤喵特app账号注销步骤喵特app账号注销步骤喵特app账号注销步骤

    喵特app账号注销操作流程: 1、打开app后,先点击界面右下角“我的”,然后点击右上角的“设置”图标(齿轮形状); 2、进入设置页面后,选择顶部选项中的“账号设置”; 3、在账号设置中,向下滚动找到以红色文字标注的“注销账户”选项; 4、系统会要求验证身份,输入当前账号绑定的手机号码完成验证; 5…

    2026年9月3日 用户投稿
    000
  • Laravel 8 中间件请求参数获取与用户认证详解

    本文旨在解决 Laravel 8 中间件中请求参数获取失败的问题,并深入探讨了用户认证的最佳实践。通过分析常见错误原因,我们将提供清晰的代码示例和详细的步骤,帮助开发者正确地从请求中获取参数,并构建安全可靠的身份验证机制,避免潜在的安全漏洞。 理解 Laravel 请求对象 在 Laravel 中,…

    2026年9月3日
    200

发表回复

登录后才能评论
关注微信