如何让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
相关产品推荐
相关产品推荐

