除了前面章节介绍的几个类特殊方法(方法名以双下划线(__)开头和结尾),在 Python 类中,我们还可以通过重写几个特殊方法,实现自定义一个序列类。表 1 列出了和自定义序列类有关的几个特殊方法。
方法名 | 功能 |
---|---|
__len__(self) | 返回序列类中存储元素的个数。 |
__contains__(self, value) | 判断当前序列中是否包含 value 这个指定元素。 |
__getitem__(self, key) | 通过指定的 key(键),返回对应的 value(值)。 |
__setitem__(self, key) | 修改指定 key(键)对应的 value(值)。 |
__delitem__(self, key) | 删除指定键值对。 |
注意,在对表 1 中的这些特殊方法进行重写时,在实现其基础功能的基础上,还可以根据实际情况,对各个方法的具体实现进行适当调整。以 __setitem__() 方法为例,当在序列中未找到指定 key 的情况下,该方法可以报错,当然也可以将此键值对添加到当前序列中。
另外值得一提的是,在实现自定义序列类时,并不是必须重写表 1 中全部的特殊方法。如果该自定义序列是一个不可变序列(即序列中的元素不能做修改),则无需重写 __setitem__() 和 __delitem__() 方法;反之,如果该自定义序列是一个可变序列,可以重写以上 5 个特殊方法。
下面程序实现了一个比较简单的序列类,这是一个字典类,其特点是只能存储 int 类型的元素:
class IntDic:
def __init__(self):
# 用于存储数据的字典
self.__date = {}
def __len__(self):
return len(list(self.__date.values()))
def __getitem__(self, key):
# 如果在self.__changed中找到已经修改后的数据
if key in self.__date :
return self.__date[key]
return None
def __setitem__(self, key, value):
#判断value是否为整数
if not isinstance(value, int):
raise TypeError('必须是整数')
#修改现有 key 对应的 value 值,或者直接添加
self.__date[key] = value
def __delitem__(self, key):
if key in self.__date : del self.__date[key]
dic = IntDic()
#输出序列中元素的个数,调用 __len__() 方法
print(len(dic))
#向序列中添加元素,调用 __setitem__() 方法
dic['a'] = 1
dic['b'] = 2
print(len(dic))
dic['a'] = 3
dic['c'] = 4
print(dic['a'])
#删除指定元素,调用 __delitem__() 方法
del dic['a']
print(dic['a'])
print(len(dic))
程序执行结果为: