Python 里**自定义数据单元**

Python 里自定义数据单元 (用来打包一组关联数据,类似结构体)一共就4 种主流写法,从最简单到常用依次讲,附对比、用法、适用场景,全程精简。

一、4 种常用数据单元写法

1. 普通元组 tuple(最原始)

只是把多个值打包,无字段名,只能按下标访问

python

运行

ini 复制代码
# 定义/创建
card = ("A", "红桃")

# 取值(只能用索引)
print(card[0])  # A
print(card[1])  # 红桃

特点

  • 最简,不用额外导入
  • 只读、不可修改
  • 缺点:可读性差,记不住下标对应含义适用:临时、简单数据,不用区分字段名。

2. 命名元组 namedtuple(你正在学的)

collections.namedtuple带字段名的只读元组,项目里高频用。

python

运行

ini 复制代码
from collections import namedtuple

# 定义数据单元
Card = namedtuple("Card", ["点数", "花色"])
# 创建实例
c = Card("A", "红桃")

# 两种取值:字段名 / 下标
print(c.点数)
print(c[1])

特点

  • 一行定义,不用写 __init__
  • 只读、安全、支持解包、遍历
  • 缺点:属性不能修改 ,没法动态增删字段适用:固定字段、只读结构化数据(卡牌、坐标、日志、简单记录)。

3. 普通自定义类 class(传统写法)

手写 __init__,自由度最高。

python

运行

ruby 复制代码
class Card:
    def __init__(self, 点数, 花色):
        self.点数 = 点数
        self.花色 = 花色

c = Card("A", "红桃")
print(c.点数)

# 可以修改属性
c.点数 = "K"

特点

  • 属性可读写
  • 可以随意加方法、逻辑、校验
  • 缺点:代码偏多适用:需要修改数据、绑定业务方法、复杂逻辑的单元。

4. 数据类 dataclasses.dataclass(Python3.7+ 主推)

官方标准数据类,兼顾简洁 + 可读写,现在最流行。

python

运行

python 复制代码
from dataclasses import dataclass

@dataclass
class Card:
    点数: str
    花色: str

c = Card("A", "红桃")
print(c.点数)

# 支持修改
c.花色 = "黑桃"

特点

  • 不用手写 __init__,代码简洁
  • 属性可读写,支持类型标注、默认值
  • 可自由添加方法适用:绝大多数业务数据单元(现代 Python 项目首选)。

二、四种方式核心对比(一眼分清)

表格

写法 是否导入 能否改属性 优点 缺点
普通 tuple 不用 ❌ 只读 最简单 无字段名,可读性差
namedtuple 需导入 ❌ 只读 简洁、有字段名、轻量 不能改属性
普通 class 不用 ✅ 可读写 完全自由、可加方法 代码繁琐
@dataclass 需导入 ✅ 可读写 简洁 + 灵活,官方推荐 低版本 Python 不支持

三、怎么选(直接按场景用)

  1. 临时凑一组数据,不在乎字段名 → 用 tuple

  2. 固定字段、数据不允许修改、追求极简 → 用 namedtuple(你卡牌案例就用它)

  3. 需要改属性、还要写各种方法

    • Python3.7 及以上 → 优先 @dataclass
    • 老旧版本 / 追求兼容 → 手写 普通 class

四、补充两个冷门(了解即可)

  1. 字典 dict 也能当临时数据单元:d = {"点数":"A", "花色":"红桃"}优点灵活,缺点:不是 "单元对象",语法松散,不适合做标准数据结构。
  2. slots 优化类 在普通类上加 __slots__ 减少内存,适合大量创建对象,属于进阶优化。

最简总结

日常自定义数据单元就记 3 主力:

  • 只读、轻量 → namedtuple
  • 可读写、新项目 → dataclass
  • 兼容老环境、复杂逻辑 → 普通 class
相关推荐
cidy_981 小时前
将 Figma 接入 Codex MCP:从 `/plugins` 到本地插件配置的完整教程
前端
vivo互联网技术1 小时前
动效开发不踩坑:几种动效实现方案对比与实战选型
前端·性能优化·动效
Csvn1 小时前
【Vue3】Composition API vs Options API —— 什么场景该选哪个
前端
Csvn1 小时前
Vue3 迁移血泪史:v-model 的 .sync 陷阱,90% 升级项目都会踩
前端·vue.js
光影少年1 小时前
js单线程,为什在node环境下的js可以处理高并发请求?
前端·javascript·掘金·金石计划
vim怎么退出1 小时前
Dive into React——事件系统
前端·react.js·源码阅读
KaMeidebaby1 小时前
卡梅德生物技术快报|重组蛋白的表达和纯化:工艺调试全记录:大肠杆菌体系重组蛋白的表达和纯化参数标定(肠激酶轻链案例)
前端·人工智能·算法·数据挖掘·数据分析
Cobyte1 小时前
19.Vue Vapor 的实现原理原来这么简单
前端·javascript·vue.js
郝学胜-神的一滴2 小时前
中级OpenGL教程 009:用环境光告别模型死黑
前端·c++·unity·godot·图形渲染·opengl·unreal