python打卡day29

类的装饰器

知识点回顾

  1. 类的装饰器
  2. 装饰器思想的进一步理解:外部修改、动态
  3. 类方法的定义:内部定义和外部定义

回顾一下,函数的装饰器是 :接收一个函数,返回一个修改后的函数。类也有修饰器,类装饰器本质上确实是一个函数,他的逻辑类似,接收一个类,返回一个修改后的类或者新类。通过类装饰器,可以在不修改类内部代码的情况下,为多个类统一添加功能(如日志、统计),类装饰器有两种常见实现方式:

  • 直接修改类(添加新的方法或属性,修改原有方法比如构造方法)
  • 使用 wrapper() 返回新类(更接近函数装饰器模式)
# 方式1:直接修改类
def decorator1(cls):cls.new_attr = 'value'  # 直接添加属性return cls  # 返回原类# 方式2:使用wrapper(类似函数装饰器)
def decorator2(cls):class Wrapper(cls):  # 创建子类new_attr = 'value'return Wrapper

举个具体例子来看看,这是直接修改类

# 定义类装饰器:为类添加日志功能
def class_logger(cls):# 保存原始的 __init__ 方法original_init = cls.__init__def new_init(self, *args, **kwargs):# 新增实例化日志print(f"[LOG] 实例化对象: {cls.__name__}")original_init(self, *args, **kwargs)  # 调用原始构造方法# 将类的 __init__ 方法替换为新方法cls.__init__ = new_init# 为类添加一个日志方法(示例)def log_message(self, message):print(f"[LOG] {message}")cls.log = log_message  # 将方法绑定到类,这是一种将外部函数添加为类的属性的方法return cls# 定义简单打印类,应用装饰器
# 同样是语法糖的写法
@class_logger
class SimplePrinter:def __init__(self, name):self.name = name  # 构造方法:初始化名称def print_text(self, text):"""简单打印方法"""print(f"{self.name}: {text}")# 使用示例
printer = SimplePrinter("Alice")  # 实例化时触发装饰器的日志
printer.print_text("Hello, World!")  # 调用普通方法
printer.log("这是装饰器添加的日志方法")  # 调用装饰器新增的方法# 输出:[LOG] 实例化对象: SimplePrinter
# 输出:Alice: Hello, World!
# 输出:[LOG] 这是装饰器添加的日志方法

第二种用 wrapper() 封装返回的方法就不谈了,之前函数装饰器接触过

收获心得:

学了这么多天,感觉python就是万物皆可类,类又有属性和方法,跟原先的C语言学习比起来,从数据结构、从函数或者类的复用、封装、动态修改等方面更进一步有了不同

@浙大疏锦行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十一、STM32入门学习之FREERTOS移植

目录 一、FreeRTOS1、源码下载:2、解压源码 二、移植步骤一:在需要移植的项目中新建myFreeRTOS的文件夹,用于存放FREERTOS的相关源码步骤二:keil中包含相关文件夹和文件引用路径步骤三:修改FreeRTOSConfig.h文件的相关…

2025 年十大网络安全预测

随着我们逐步迈向 2026 年,网络安全领域正处于一个关键的转折点,技术创新与数字威胁以前所未有的复杂态势交织在一起。 地缘政治环境进一步加剧了这些网络安全挑战,国际犯罪组织利用先进的技术能力来追求战略目标。 人工智能在这一不断演变…

Mac 环境下 JDK 版本切换全指南

概要 在 macOS 上安装了多个 JDK 后,可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK,然后将你想使用的版本路径赋值给环境变量 JAVA_HOME,…

中级网络工程师知识点6

1.堆叠方式可以共享使用交换机背板带宽;级联方式可以使用双绞线将交换机连接在一起 2.光功率计是专门测量光功率大小的仪器,在对光缆进行检测时,通过在光缆的发送端和接收端分别测量光功率,进而计算出光衰情况。 3.光时域反射计…

动态规划——乌龟棋

题目描述 解题思路 首先这是一个很明显的线性dp的题目,很容易发现规律 数据输入 我们用 h[ N ] 数组存储每一个格子的分数 用 cnt [ ],数组表示每一中卡片的数目 1,状态表示 因为这里一个有4种跳跃方式可以选择 f[ i ][ a ][ b ][ c ][ d…

C#自定义控件-实现了一个支持平移、缩放、双击重置的图像显示控件

1. 控件概述 这是一个继承自 Control 的自定义控件,主要用于图像的显示和交互操作,具有以下核心功能: 图像显示与缩放(支持鼠标滚轮缩放)图像平移(支持鼠标拖拽)视图重置(双击重置…

C++ map multimap 容器:赋值、排序、大小与删除操作

概述 map和multimap是C STL中的关联容器,它们存储的是键值对(key-value pairs),并且会根据键(key)自动排序。两者的主要区别在于: map不允许重复的键multimap允许重复的键 本文将详细解析示例代码中涉及的map操作,包括赋值、排…

AI Agent开发第70课-彻底消除RAG知识库幻觉(4)-解决知识库问答时语料“总重复”问题

开篇 “解决知识库幻觉”系列还在继续,这是因为:如果只是个人玩玩,像自媒体那些说的什么2小时搭一个知识库+deepseek不要太香一类的RAG或者是基于知识库的应用肯定是没法用在企业级落地上的。 我们真的经历过或者正在经历的人都是知道的,怎么可能2小时就搭建完成一个知识…

【DAY22】 复习日

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 仔细回顾一下之前21天的内容 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测

【Docker】Docker Compose方式搭建分布式协调服务(Zookeeper)集群

开发分布式应用时,往往需要高度可靠的分布式协调,Apache ZooKeeper 致力于开发和维护开源服务器,以实现高度可靠的分布式协调。具体内容见zookeeper官网。现代应用往往使用云原生技术进行搭建,如何用Docker搭建Zookeeper集群,这里介绍使用Docker Compose方式搭建分布…

若依框架Consul微服务版本

1、最近使用若依前后端分离框架改造为Consul微服务版本 在这里分享出来供大家参考 # Consul微服务配置参数已经放置/bin/Consul微服务配置目录 仓库地址: gitee:https://gitee.com/zlxls/Ruoyi-Consul-Cloud.git gitcode:https://gitcode.c…

BOM知识点

BOM(Browser Object Model)即浏览器对象模型,是用于访问和操作浏览器窗口的编程接口。以下是一些BOM的知识点总结: 核心对象 • window:BOM的核心对象,代表浏览器窗口。它也是全局对象,所有全…

什么是迁移学习(Transfer Learning)?

什么是迁移学习(Transfer Learning)? 一句话概括 迁移学习研究如何把一个源领域(source domain)/源任务(source task)中获得的知识迁移到目标领域(target domain)/目标任…

[创业之路-362]:企业战略管理案例分析-3-战略制定-华为使命、愿景、价值观的演变过程

一、华为使命、愿景、价值观的演变过程 1、创业初期(1987 - 1994 年):生存导向,文化萌芽 使命愿景雏形:1994年华为提出“10年之后,世界通信行业三分天下,华为将占一份”的宏伟梦想&#xff0c…

Python黑魔法与底层原理揭秘:突破语言边界的深度探索

Python黑魔法与底层原理揭秘:突破语言边界的深度探索 开篇:超越表面的Python Python常被称为"胶水语言",但其真正的威力在于对底层的高度可控性。本文将揭示那些鲜为人知的Python黑魔法,带你深入CPython实现层面&…

Es的text和keyword类型以及如何修改类型

昨天同事触发定时任务发现es相关服务报了一个序列化问题, 今天早上捕获异常将异常堆栈全部打出来看,才发现是聚合的字段不是keyword类型的问题。 到kibbna命令行执行也是一样的错误 使用 /_mapping查看索引的字段类型,才发现userUniqueid是te…

大语言模型 07 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机训练 预训练 监督微调

写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…

【Android】从Choreographer到UI渲染(二)

【Android】从Choreographer到UI渲染(二) Google 在 2012 年推出的 Project Butter(黄油计划)是 Android 系统发展史上的重要里程碑,旨在解决长期存在的 UI 卡顿、响应延迟等问题,提升用户体验。 在 Androi…

mvc-ioc实现

IOC 1)耦合/依赖 依赖,是谁离不开谁 就比如上诉的Controller层必须依赖于Service层,Service层依赖于Dao 在软件系统中,层与层之间存在依赖。我们称之为耦合 我们系统架构或者设计的一个原则是&#xff…

MATLAB安装常见问题解决方案

目前新版本的matlab安装往往需要十几G的本地安装容量,例如matlab2022b、matlab2023b, 首先就是要保证本地硬盘空间足够大,如果没有足够的本地内存空间,那么可以尝试释放本地硬盘空间,或者安装所需内存空间较小的旧版本的matlab&am…