魔法方法 : 定制序列

1、基于序列的三大容器

分别是 列表、元组、字符串

2、协议

协议(Protocols)与其他编程语言中的接口相似,他规定了那些方法必须被定义。

在python中,协议更像是一种指南,例如鸭子类型,一只鸟像鸭子一样走,像鸭子一样叫,像鸭子一样游然后这只鸟就可以叫做鸭子。

3、容器类型的协议

如果希望定制的容器是不可变的,那么只需要定义__len__ 和__getitem__ 方法

如果希望定制的容器是可变的,那么还需要定义 __setitem__ 和__delitem__方法

4、魔法方法

_len__(self)

定义当被 len() 调用时的行为(返回容器中元素的个数)

__getitem__(self, key)

定义获取容器中指定元素的行为,相当于 self[key]

__setitem__(self, key, value)

定义设置容器中指定元素的行为,相当于 self[key] = value

__delitem__(self, key)

定义删除容器中指定元素的行为,相当于 del self[key]




例如,定义一个不可改变的列表,且可以记录每个元素的访问次数。

class MyList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(self.values,0)

    def __len__(self):
        return len(self.values)

    def __getitem__(self, key):
        if len(self.values):
            self.count[self.values[key]] += 1
            return self.values[key]
        else:
            return '此列表为空,无法查询'


c1 = MyList(1,3,5,7,9)
c2 = MyList('a','b','c','d','e')
c3 = MyList()
print(c1[3])       #  输出  7
print(c1[3])       #  输出  7
print(c1.count)    #  输出  {1: 0, 3: 0, 5: 0, 7: 2, 9: 0}

print(c2[2])       #  输出  c
print(c2.count)    #  输出  {'a': 0, 'b': 0, 'c': 1, 'd': 0, 'e': 0}


print(c3[0])       #  输出  此列表为空,无法查询

你可能感兴趣的:(python,定制序列,魔法方法)