博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 利用 魔法方法 定制序列类型
阅读量:362 次
发布时间:2019-03-04

本文共 2559 字,大约阅读时间需要 8 分钟。

文章目录

介绍

Python里的复合数据类型有序列类型,映射类型(字典)和集合类型,它们都是容器类型,所谓的容器类型,就是能存下各种各样的对象

  • 在Python语言中,也有类似于其他编程语言的接口,称之为协议(protocols)

  • 规定你在重写某个类时,哪些方法必须定义,它更像一种建议,并不是那么正式,事实上协议(protocols)更像一种指南,它告诉你,在某些情况下该去做哪些

  • 在定制容器类型时,容器类型也需要相关的协议

  • 如果定制出来的类型不可变,只需定义__ len__()__ getitem__()方法,比如:字符串和元组

  • 如果定于的容器类型可变,再需要上面两种函数的基础上,还需定义__ setitem__()__ deltem__()方法

容器类型的魔法方法

方法 说明
__ len__(self) 定义当len()被调用时,返回容器中元素(对象)的个数
__ getitem__(self,key) 定义获取容器中指定元素的行为,相当于self[key]进行切片
__ setitem__(self,key,value) 定义设置容器中元素的行为,相当于self[key] = value
__ del__(self,key) 定义删除容器中指定元素的行为,相当于del self[key]
__ iter__(self,key) 定义跌代容器中元素的行为
__ reversed__ (self) 定义当被reversed()函数调用时的行为
__ contains__(self,item) 定义当成员使用成员测试运算符(in 或 not in)时的行为

定义容器的实例

  1. 定义容器时进行初始化,传入可变参数*args作为元组传入数据
  2. 列表表达式向列表中添加元素
  3. 利用字典完成访问计数
class CountList():    def __init__(self,*args):   #args 多参数组成的元组tuple        self.values = [num for num in args] #列表表达式 返回 for - in 中间的元素,符合表达式条件的进行添加        self.count = {
}.fromkeys(range(len(self.values)),0)#fromkeys的第一个参数是序列类型,每一个值都被第二个参数赋值 #访问count时返回一个字典 def __len__(self): return len(self.values) def __getitem__(self,key): #访问下标时自动调用 self.count[key] += 1 return self.values[key]>>> ls = CountList(1,2,3)>>> ls[0]1>>> ls[1]2>>> ls.count{
0: 1, 1: 1, 2: 0}>>> ls[0] = 2Traceback (most recent call last): File "
", line 1, in
ls[0] = 2TypeError: 'CountList' object does not support item assignment
  • 可见上述定义的列表类型并不能修改元素,为了修改容器中的元素,需重写__ set__(self,key,vlaue)
class Clist():    def __init__(self, *args):        self.values = [num for num in args]        self.count = {
} for i in args: self.count[i] = self.count.get(i,0) def __len__(self): return len(self.values) def __getitem__(self,key): if key >= len(self.values): print("超出索引") else: self.count[self.values[key]] = self.count.get(self.values[key],0) + 1 return self.values[key] def __setitem__(self,key,value): if key >= len(self.values): print("超出索引") else: del self.count[self.values[key]] #必须先删除要改变的元素次数,再重新进行赋值 self.values[key] = value #否则删除元素不可控 def __delitem__(self, key): if key >= len(self.values): print("超出索引") else: del self.count[self.values[key]] #先删除后需要删除计数器里的元素 del self.values[key] >>> ls = Clist(1,2,3)>>> ls[0]1>>> ls[1]2>>> ls[2]3>>> ls[3]超出索引>>> ls.count{
1: 1, 2: 1, 3: 1}>>> ls[0] = 4>>> ls[0]4>>> ls.count{
2: 1, 3: 1, 4: 1}

转载地址:http://wkyg.baihongyu.com/

你可能感兴趣的文章