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

给类或实例打上标识即类的元数据标签方便程序在运行时对其进行分类、识别、筛选

给类或实例打上标识即类的元数据标签方便程序在运行时对其进行分类、识别、筛选

class Fruit:# 基础水果类,所有水果都继承它_tag_names = ["fruit"]def __init__(self, name):self.name = nameclass Apple(Fruit):# 苹果类,继承水果类_tag_names = ["fruit", "apple"]def __init__(self, name, color):super().__init__(name)self.color = colorclass RedApple(Apple):# 红苹果类,继承苹果类_tag_names = ["fruit", "apple", "red", "sweet"]def taste(self):return "甜脆多汁"class GreenApple(Apple):# 青苹果类,继承苹果类_tag_names = ["fruit", "apple", "green", "sour"]def taste(self):return "酸甜爽口"# 演示如何使用 _tag_names 进行筛选和分类
def find_fruits_by_tag(fruit_list, tag):"""根据标签筛选水果"""return [fruit for fruit in fruit_list if tag in fruit._tag_names]# 创建水果实例
fuji = RedApple("富士苹果", "红色")
granny_smith = GreenApple("澳洲青苹", "绿色")# 所有水果的列表
fruits = [fuji, granny_smith]# 按标签筛选
print("所有苹果:")
for apple in find_fruits_by_tag(fruits, "apple"):print(f"- {apple.name} ({apple.color})")print("\n所有红色的水果:")
for red_fruit in find_fruits_by_tag(fruits, "red"):print(f"- {red_fruit.name},味道:{red_fruit.taste()}")print("\n所有带酸味的水果:")
for sour_fruit in find_fruits_by_tag(fruits, "sour"):print(f"- {sour_fruit.name},味道:{sour_fruit.taste()}")
所有苹果:
- 富士苹果 (红色)
- 澳洲青苹 (绿色)所有红色的水果:
- 富士苹果,味道:甜脆多汁所有带酸味的水果:
- 澳洲青苹,味道:酸甜爽口

_tag_names 的作用

_tag_names 本质是类的元数据标签,用于给类或实例打上“标识”,方便程序在运行时对其进行分类、识别、筛选或管理

  1. 自我标识与分类
    标签是类的“身份名片”。比如在水果例子中:

    • Fruit 类的 _tag_names = ["fruit"] 表示“我属于水果大类”;
    • Apple 类的 _tag_names = ["fruit", "apple"] 表示“我是水果,且更具体地属于苹果”;
    • 这种标签可以形成层级关系(从大类到小类),让程序能快速判断一个对象的“归属”。
  2. 动态筛选与逻辑处理
    标签可以作为“筛选条件”,让程序在运行时批量处理符合条件的对象。
    比如在之前的例子中,我们可以通过 find_fruits_by_tag 函数,根据 _tag_names 中的标签快速找出所有“苹果”("apple" 标签)或“红色水果”("red" 标签),而不需要逐个判断对象的类型。

  3. 框架/库的组件管理
    在复杂框架中,标签的作用更明显:

    • 框架可以通过标签自动注册组件(比如“所有带 某个 标签的类都是库内组件”);
    • 在日志、序列化或插件系统中,标签可以帮助框架识别组件的功能,从而执行对应的逻辑。
  4. 代码可读性与维护性
    标签是一种“自解释”的元数据。开发者看到 _tag_names = ["fruit", "apple"] 时,能快速理解这个类的定位(属于水果,且是苹果),无需深入阅读类的具体实现。

为什么前缀有一个 _

在 Python 中,变量/属性名前的单下划线 _ 是一种命名规范,表示这个属性是**“内部使用”的**,而非“公开接口”。具体含义是:

  1. 提示开发者:这是内部属性,谨慎修改
    单下划线不是语法限制(Python 没有真正的“私有变量”),而是一种“约定”。它告诉其他开发者:

    • 这个属性是类内部逻辑的一部分(比如标签用于类的自我标识),外部代码不应该随意修改;
    • 若强行修改(比如给 Apple_tag_names 删掉 "apple" 标签),可能会破坏类的原有逻辑(比如筛选“苹果”时会失效)。
  2. 区分“公共接口”和“内部实现”
    类通常会暴露一些供外部调用的“公共方法/属性”(比如 Appletaste() 方法),而 _tag_names 这类属性是支撑类功能的“内部细节”。用 _ 前缀可以清晰区分两者,让代码结构更清晰。

  3. 避免命名冲突
    在继承场景中,子类可能需要定义和父类类似的属性。_ 前缀可以减少冲突(比如父类有 _tag_names,子类可以安全地重写它而不用担心覆盖父类的公开属性)。

http://www.dtcms.com/a/339576.html

相关文章:

  • 32K上下文开源语音理解、40分钟深度交互——Voxtral-Small-24B-2507本地部署教程
  • GCC编译输出中text,data,bss和dec的含义
  • 构建自主企业:AgenticOps 的技术蓝图
  • 基于 STM32 单片机的远程老人监测系统设计
  • 科大讯飞语音服务之:BNF文件
  • 基于用户画像的个性化匹配模型
  • 【Proteus仿真】【51单片机】基于51单片机自动售货机12864屏幕
  • 这是关于Oracle碎片的文章
  • 空间智能赋能低空经济建设
  • 录音转文字:怎么快速精转提取重点?
  • 【弦乐教程】四 / 五部和声铺底写作指南 —— 从声部配置到禁忌规避
  • 8.19笔记
  • 训练数据转 LMDB 格式:必要性解析与核心优势全指南
  • 假设检验的原理
  • PDR与RSSI融合定位入门:从原理到实践
  • 如何用Prometheus和FastAPI打造任务监控的“火眼金睛”?
  • WSL虚拟机(我的是ubuntu20.04)将系统文件转移到E盘
  • 前端面试核心技术30问
  • 35岁对工作的一些感悟
  • C++常见面试题-6.算法
  • 汉诺塔问题深度解析:递归算法的优雅实现与可视化演示
  • strlen 函数的使用与模拟实现
  • Kubernetes 的 YAML 配置文件-apiVersion
  • Python入门第10课:用Python操作Excel,openpyxl与pandas实用技巧
  • oracle官网下载jdk历史版本,jdk历史版本下载
  • 涡流-信号完整性分析
  • LCC-LCC谐振式无线充电系统控制技术研究的复现
  • VsCode 便携版(绿色版)下载及配置
  • 交换机原理
  • 自建知识库,向量数据库 (十)之 文本向量化——仙盟创梦IDE