特殊成员方法(__len__、__getitem__、__setitem__、__delitem__)

  • 自定义序列
方法 说明
__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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容