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
相关推荐
天蓝色的鱼鱼1 小时前
关于 CSS 你可能不知道的属性,但关键时刻很有用
前端·css
泯泷2 小时前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷2 小时前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜2 小时前
Spring Boot 核心知识点总结
前端
lichenyang4532 小时前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
古夕3 小时前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js
朦胧之3 小时前
页面白屏卡住排查方法
前端·javascript
用户593608741403 小时前
Playwright 黑魔法:用 ClipboardEvent 绕过 React 富文本编辑器
前端
石山岭3 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端