
python 利用 魔法方法 定制序列类型
初始化:通过 列表表达式:利用列表表达式(List Comprehension)向容器中添加元素。 字典完成访问计数:通过字典(Dict)实现访问计数功能。
发布日期:2021-05-07 23:05:32
浏览次数:20
分类:精选文章
本文共 2434 字,大约阅读时间需要 8 分钟。
Python容器类型详解
1. 容器类型的概念
在 Python 中,容器类型(Container Types)是指能够存储和管理各种数据的类别。主要包括以下三种类型:
- 序列类型(Sequence):如列表(List)、元组(Tuple)等,支持按顺序存储和访问元素。
- 映射类型(Mapping):如字典(Dict),用于存储键-值对,具有高效的查找功能。
- 集合类型(Collection):如集合(Set)、字典集合(Dict_set)等,用于存储一组唯一元素。
这些容器类型作为容器,能够承载多种数据类型,成为 Python 开发的重要工具。
2. 容器类型的协议(Protocols)
在定制容器类型时,必须遵循特定的协议(Protocols),以确保容器具备必要的操作功能。具体包括以下几个方面:
- 不可变容器:如字符串(String)和元组(Tuple),只需实现
__len__()
和__getitem__()
方法即可。 - 可变容器:如列表(List)和字典(Dict),除上述方法外,还需实现
__setitem__()
和__delitem__()
方法。
通过协议的遵循,可以确保容器类型在不同场景下都能满足开发者的需求。
3. 容器类型的魔法方法
容器类型的核心功能由一系列魔法方法(Magic Methods)提供。常见的魔法方法包括:
方法名称 | 描述 |
---|---|
__len__() | 返回容器中元素的总数。 |
__getitem__(self, key) | 定义通过键(key)访问容器中元素的行为。 |
__setitem__(self, key, value) | 定义通过键设置容器中元素的行为。 |
__delitem__(self, key) | 定义通过键删除容器中元素的行为。 |
__iter__(self) | 定义遍历容器中元素的行为。 |
__reversed__(self) | 定义反向遍历容器中元素的行为。 |
__contains__(self, item) | 定义成员测试运算符(in 或 not in )的行为。 |
这些魔法方法为容器类型提供了灵活的操作接口,开发者可根据需要自定义容器行为。
4. 定义容器的实例
在实际开发中,定义容器类型通常需要遵循以下原则:
*args
接收可变参数,作为数据的初始值。例如,以下是一个简单的计数列表(CountList)实现:
class CountList: def __init__(self, *args): self.values = [num for num in args] self.count = {num: 0 for num in self.values} def __len__(self): return len(self.values) def __getitem__(self, key): self.count[key] += 1 return self.values[key] def __setitem__(self, key, value): del self.count[self.values[key]] self.values[key] = value def __delitem__(self, key): del self.count[self.values[key]] del self.values[key]
5. 容器类型的实际应用
在实际项目中,开发者常会基于容器类型定义自定义类。以下是一个改进后的容器类实现:
class Clist: def __init__(self, *args): self.values = list(args) self.count = {} for num in args: self.count[num] = self.count.get(num, 0) + 1 def __len__(self): return len(self.values) def __getitem__(self, key): if key >= len(self.values): print("超出索引") return None return self.values[key] def __setitem__(self, key, value): if key >= len(self.values): print("超出索引") return del self.count[self.values[key]] self.values[key] = value def __delitem__(self, key): if key >= len(self.values): print("超出索引") return del self.count[self.values[key]] del self.values[key]
通过上述实现,可以实现一个基本的计数容器,既支持读取操作,又支持元素赋值和删除。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月14日 05时57分03秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
子集(LeetCode 78)
2019-03-05
旋转数组的最小值
2019-03-05
1004 Counting Leaves (30分)
2019-03-05
1093 Count PAT‘s (25分) 含DP做法
2019-03-05
一篇解决JMM与volatile详解(二)
2019-03-05
数据结构之数组与经典面试题(二)
2019-03-05
无锁并发框架-Disruptor的使用(二)
2019-03-05
Android wm命令
2019-03-05
boot.img 解包与打包
2019-03-05
Android4.4 平板背光设置
2019-03-05
递归复习--二叉搜索树
2019-03-05
jvm-02
2019-03-05
spring boot@Value和bean执行顺序问题
2019-03-05
从浏览器输入网址到服务器返回经历的过程
2019-03-05
解决Genymotion无法拖拽的问题
2019-03-05
中国石油大学《计算机文化基础》在线考试(客观题)
2019-03-05
中国石油大学《 管理心理学(行政管理专业禁选)》在线考试
2019-03-05
机器学习(numpy/matplotlib/scipy)学习笔记
2019-03-05
HTML CSS JS 特殊字符表
2019-03-05