You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python中的my_data变为不可变对象且保留迭代能力?

解决可变对象转不可变且保留迭代能力的问题

一、将my_data改为不可变对象

当前代码里my_data是可变的列表,要实现不可变同时保留迭代能力,最直接的方式是改用元组(tuple)——元组是不可变序列,支持迭代,遍历逻辑和列表基本一致。

修改后的ParserClass代码如下:

class ParserClass:
    def __init__(self) -> None:
        self.my_data = ()  # 初始化为空元组(不可变)

    def parsing_method(self, demo_data) -> None:
        # 先用临时列表收集元素,再转换为元组赋值
        parsed_items = [
            SomeDataclass(name=name, description=desc)
            for name, desc in demo_data.items()
        ]
        self.my_data = tuple(parsed_items)

修改后self.my_data变成不可变元组,无法通过append、pop等方法修改内容,同时依然可以正常遍历迭代。

二、关于dataclass的替代实现

你当前用的@dataclass(frozen=True)已经是标准库中不可变数据类的最优实现之一,完全满足需求。如果想尝试其他方案,可以用collections.namedtuple(本质是元组子类,同样不可变):

from collections import namedtuple

# 替代原有的dataclass定义
SomeDataclass = namedtuple('SomeDataclass', ['name', 'description'])

不过dataclass在类型提示、默认值设置、扩展性上比namedtuple更灵活,推荐继续使用原有的frozen=True dataclass。

完整示例代码

from dataclasses import dataclass

data = {'demo1': "description for demo 1", "demo2": 'description for demo 2'}

@dataclass(frozen=True)
class SomeDataclass:
    name: str
    description: str


class ParserClass:
    def __init__(self) -> None:
        self.my_data = ()

    def parsing_method(self, demo_data) -> None:
        parsed_items = [
            SomeDataclass(name=name, description=desc)
            for name, desc in demo_data.items()
        ]
        self.my_data = tuple(parsed_items)

test = ParserClass()
test.parsing_method(data)
for item in test.my_data:
    print(item.name, item.description)

内容的提问来源于stack exchange,提问作者Chaban33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:18:41