- 自定义序列
| 方法 | 说明 |
|---|---|
| __len__(self) | 返回序列中元素的个数。使用len函数获取序列对象的长度时会调用该方法 |
| __getitem__(self, key) | 返回与所给键对应的值。__getitem__方法的第2个参数表示键。在使用sequence[key]获取值时会调用该方法 |
| __setitem__(self, key, value) | 设置key对应的值。__setitem__方法的第2个参数表示键(key),第3个参数表示值(value)。当使用sequence[key]=value设置序列中键对应的值时调用该方法 |
| __delitem__(self, key) | 从序列中删除键为key的key-value对。当使用del关键字删除序列中键为key的key-value对时调用该方法 |
定义一个名为FactorialDict的序列类,该类的功能是计算key对应的value的阶乘,也就是说,在赋值时需要为某个key设置一个整数或可以转换为整数的值,但是在使用该key获取对应的value时,返回的却是value的阶乘。
class FactorialDict:
def __init__(self):
super().__init__()
# 创建字典对象
self.numDict = {}
# 用于计算阶乘的方法
def factorial(self, n):
if n == 0 or n == 1:
return 1
else:
return n * self.factorial(n - 1)
# 从字典中获取key对应的value时调用该方法
def __getitem__(self, key):
print("__getitem__方法被调用,key={}".format(key))
# 判断key是否在字典中存在,如果存在,返回value的阶乘,否则返回0
if key in self.numDict:
return self.factorial(self.numDict[key])
else:
return 0
# 设置key对应的value时调用该方法
def __setitem__(self, key, value):
print("__setitem__方法调用,key={}".format(key))
self.numDict[key] = int(value)
# 使用del语句删除key对应的key-value对时调用
def __delitem__(self, key):
print("__delitem__方法被调用,key={}".format(key))
del self.numDict[key]
# 使用len函数获取字典中key-value对个数时调用
def __len__(self):
print("__len__方法被调用")
return len(self.numDict)
# 创建FactorialDict对象
d = FactorialDict()
# 设置字典中的key-value对
d['4!'] = 4
d['7!'] = 7
d['12!'] = 12
# 获取4的阶乘
print('4!', '=', d['4!'])
# 获取7的阶乘
print('7!', '=', d['7!'])
# 获取12阶乘
print('12', '=', d['4!'])
# 获取字典的长度
print('len', '=', len(d))
# 删除key为'7!'的key-value对
del d['7!']
# 获取7的阶乘
print('7!', '=', d['7'])
# 获取字典的长度
print('len', '=', len(d))
输出结果:
__setitem__方法调用,key=4!
__setitem__方法调用,key=7!
__setitem__方法调用,key=12!
__getitem__方法被调用,key=4!
4! = 24
__getitem__方法被调用,key=7!
7! = 5040
__getitem__方法被调用,key=4!
12 = 24
__len__方法被调用
len = 3
__delitem__方法被调用,key=7!
__getitem__方法被调用,key=7
7! = 0
__len__方法被调用
len = 2
- 从内建列表、字符串和字典继承
上述代码实现自定义的序列/映射时,需要实现这4个方法,不过每次都要实现所有的4个方法太麻烦了,为此,Python提供几个内建类(list、dict和str),分别实现列表、字典和字符串的默认操作。要实现自己的列表、字典和字符串,大可不必从头实现这4个方法,只需要从这三个类继承,并实现必须的方法即可。
# 定义一个从list继承的类
class CounterList(list):
# list的构造方法必须指定一个可变参数,用于初始化列表
def __init__(self, *args):
super().__init__(*args)
# 初始化计数器
self.counter = 0
# 从列表中获取值时,计数器加1
def __getitem__(self, index):
self.counter += 1
return super(CounterList, self).__getitem__(index)
c = CounterList(range(10))
print(c)
c.reverse()
del c[4:8]
print(c)
print(c.counter)
print(c[2] + c[1])
print(c.counter)
输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 1, 0]
0
15
2