实现一个不可变字典

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何在Python中实现一个不可变字典。不可变字典是一种数据结构,一旦创建就不能被修改,这在某些需要数据保持不变的应用场景中非常有用。

👀 预览

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' 对象是不可变的")
TypeError("'ImmutableDict' 对象是不可变的")
d.get("Host")='www.labex.io'

🎯 任务

在这个项目中,你将学习:

  • 如何创建一个继承自内置 dict 类的 ImmutableDict
  • 如何在 ImmutableDict 类中实现方法以防止对字典进行修改
  • 如何测试 ImmutableDict 类以确保其行为符合预期

🏆 成果

完成这个项目后,你将能够:

  • 理解不可变数据结构的概念及其用例
  • 使用 ImmutableDict 类在Python中实现一个不可变字典
  • 通过重写适当的方法来防止对字典进行修改
  • 测试 ImmutableDict 类以确保其按预期工作

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/DataStructuresGroup -.-> python/dictionaries("Dictionaries") python/ObjectOrientedProgrammingGroup -.-> python/classes_objects("Classes and Objects") python/ObjectOrientedProgrammingGroup -.-> python/inheritance("Inheritance") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") subgraph Lab Skills python/dictionaries -.-> lab-302737{{"实现一个不可变字典"}} python/classes_objects -.-> lab-302737{{"实现一个不可变字典"}} python/inheritance -.-> lab-302737{{"实现一个不可变字典"}} python/catching_exceptions -.-> lab-302737{{"实现一个不可变字典"}} python/raising_exceptions -.-> lab-302737{{"实现一个不可变字典"}} end

实现 ImmutableDict 类

在这一步中,你将学习如何在 immutable_dict.py 文件中实现 ImmutableDict 类。按照以下步骤完成此步骤:

  1. 打开位于 /home/labex/project 目录下的 immutable_dict.py 文件。
  2. 创建一个名为 ImmutableDict 的新类,它继承自内置的 dict 类。
class ImmutableDict(dict):
  1. ImmutableDict 类中实现以下方法,以使字典变为不可变:
def __setitem__(self, key, value):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def __delitem__(self, key):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def pop(self, key, default=None):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def popitem(self):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def clear(self):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def update(self, *args, **kwargs):
    raise TypeError("'ImmutableDict' 对象是不可变的")

def setdefault(self, key, default=None):
    raise TypeError("'ImmutableDict' 对象是不可变的")

这些方法重写了 dict 类中的相应方法,并在每次尝试修改字典时引发 TypeError 异常。

  1. 保存 immutable_dict.py 文件。

测试 ImmutableDict 类

在这一步中,你将测试 ImmutableDict 类,以确保它的行为符合预期。按照以下步骤完成此步骤:

  1. 打开位于 /home/labex/project 目录下的 immutable_dict.py 文件。
  2. 在文件末尾添加以下代码来测试 ImmutableDict 类:
if __name__ == "__main__":
    d = ImmutableDict(Connection="kee-alive", Host="www.labex.io")
    print(f'{d["Connection"]=}')
    print(f'{d["Host"]=}')

    try:
        d["Host"] = "test.com"
    except TypeError as e:
        print(repr(e))

    try:
        d.pop("Host")
    except TypeError as e:
        print(repr(e))

    print(f'{d.get("Host")=}')
  1. 保存 immutable_dict.py 文件。
  2. 在终端中运行 immutable_dict.py 脚本:
python3 immutable_dict.py

输出应该是:

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' 对象是不可变的")
TypeError("'ImmutableDict' 对象是不可变的")
d.get("Host")='www.labex.io'

此输出表明 ImmutableDict 类的行为符合预期,并且任何修改字典的尝试都会引发 TypeError 异常。

恭喜!你已成功实现并测试了 ImmutableDict 类。现在,你可以在你的Python应用程序中使用此类来存储不可变数据结构。

✨ 查看解决方案并练习

总结

恭喜!你已完成这个项目。你可以在 LabEx 中练习更多实验来提升你的技能。