Python047-魔法方法:定制序列

Posted frankruby

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python047-魔法方法:定制序列相关的知识,希望对你有一定的参考价值。

一、协议是什么

1、协议(protocols)与其他编程语言中的接口很相似,它规定你那些方法必须要定义。然而在Python中协议就显的不那么正式,事实上,在Python中,协议更像是一种指南

2、容器类型的协议

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

** 如果你希望定制的容器是可变的话,那你除了定义__len__() 和__getitem__()方法外,还需要定义__setitem__()和 __delitem__()两个方法

3、容器类型

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

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

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

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

__item__(self)          定义当迭代容器中元素的行为

__reversed__(self)          定义当被reversed()调用时的行为

__contains__(self,item)       定义当使用成员测试运算符(in 或 not in)时的行为

魔法方法详解:https://fishc.com.cn/thread-48793-1-2.html

二、 编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数

#定制一个不可改变的列表,并且记录每个元素的访问次数
class CountList:
    def __init__(self,*args):#不知道需要传入多少个参数,那么就设置一个可变的参数集
        self.values = [x for x in args]#列表推导式
        #用列表推导式遍历用户传入的参数并建立一个列表
        #self.value里面的内容是用户传入的参数
        print("self_value++",self.values)
        self.count = {}.fromkeys(range(len(self.values)),0)
        #用fromey()方法建立一个字典,self.count是字典
        #字典的key是self.value的索引,对应的value值分别初始化为0
        print("self.count--",self.count)

    def __len__(self):
        return len(self.values) #当len被调用时,返回了容器中元素的个数

    def __getitem__(self,key):
        #这里用户想要得到某个参数的访问次数,需要传入该参数的索引值
        self.count[key] +=1 #每访问一次key对应的value就记录一次
        return self.values[key]
      
执行结果:
>>> c1 = CountList(1,3,5,7,9)
self_value++ [1, 3, 5, 7, 9]
self.count-- {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}
>>> c1[1]
3
>>> c1.count
{0: 0, 1: 3, 2: 0, 3: 0, 4: 0}

‘‘‘
|-- 由打印出来的结果:
|-- self_value++ [1, 3, 5, 7, 9]
|-- self.count-- {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
|-- 可以得知,列表里面放的是传入的参数,只不过是已列表推导式形成一个列表,字典里面放的是列表的索引以及访问列表内属性的次数,默认为0
|-- 采用__len__():当len被调用时,返回了容器中元素的个数
|-- 为了实现每访问一次元素,就使访问的次数叠加1,必须传入字典self.count的key,并且逐步+1:self.count[key] +=1
‘‘‘

 

 

 

 

 

 

  

以上是关于Python047-魔法方法:定制序列的主要内容,如果未能解决你的问题,请参考以下文章

Python--29 魔法方法:定制序列

魔法方法之自定义序列

Python基础——魔法方法

Python基础——魔法方法

python魔法方法构造函数序列与映射迭代器生成器

Python对象序列化与反序列化的魔法方法(__getstate__()和__setstate__())