Python3 魔法方法:定制序列

1、基于序列的三大容器

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

2、协议

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]

例子:自定义一个列表类,完成list所有功能,并增counter(index)方法返回index对应值Mylist[index]的访问次数

class Mylist:
    def __init__(self,*args):
        self.mylist = [x for x in args]
        self.count={}.fromkeys(range(len(self.mylist)),0)
        print(self.mylist)
    def __len__(self):
        return len(self.mylist)
    def __getitem__(self,key):
        self.count[key]+=1
        return self.mylist[key]

    def __setitem__(self,key,value):
        self.mylist[key]=value

    def __delitem__(self,key):
        self.mylist.remove( self.mylist[key])
        del self.count[key]

    def append(self,value):
        self.mylist.append(value)
        self.count[len(self.mylist)-1]=0

    def counter(self, key):
        return self.count[key]

    def pop(self):
        self.mylist.pop()
        self.count.pop(len(self.count)-1)

    def insert(self,index,value):
        keys=[]
        values=[]
        self.mylist.insert(index,value)
        for each_key in self.count.keys():
            keys.append(each_key)
        keys.insert(index,index)
        for i in range(index+1,len(self.mylist)):
            keys[i]+=1
        for i in range(len(keys)):
            self.count[keys[i]]=0

    def clear(self):
        self.mylist.clear()
        self.count.clear()

    def reverse(self):
        keys=[]
        values=[]
        self.mylist.reverse()
        for each_key in self.count.keys():
            keys.append(each_key)
        for each_val in self.count.values():
            values.append(each_val)
        keys.reverse()#直接调用方法不能加等号
        values.reverse()#直接调用方法不能加等号
        self.count.clear()
        for i in range(len(keys)):
            self.count[keys[i]]=values[i]

原文地址:https://www.cnblogs.com/PythonFCG/p/8436708.html

时间: 2024-10-21 00:05:30

Python3 魔法方法:定制序列的相关文章

python魔法方法-自定义序列

自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 如果要实现这个功能,就要遵循 python 的相关的协议.所谓的协议就是一些约定内容.例如,如果要将一个类要实现迭代,就必须实现两个魔法方法:__iter__.next(python3.x中为__new__).__iter__应该返回一个对象,这个对象必须实现 next 方法,通常返回的是 self 本身.而 next 方法必须在每次调用的时

Python3 魔法方法:算数运算

1.算数运算的魔法方法 在调用相应的运算符时会自动调用相应的魔法方法 比如a和b相加时(a+b)会自动调用a的__add__魔法方法进行加法操作 如果在a中找不到__add__方法python就会到b中寻找反运算的魔法方法__radd__ 2.如何在子类中调用父类的方法 使用super函数 class A: def a(self): print('正在调用A的方法') #AA=A class B(A): def b(self): print('正在调用B的方法') #super().a() su

Python3 魔法方法:属性访问

1.与属性访问有关的魔法方法 __getattr__(self,name) 定义当用户试图获取某一不存在的属性时的行为 __getattribute__(self,name) 定义当该类属性被访问时的行为 __setattr__(self,name,value) 定义一个属性被设置时的行为 __delattr__(self,name) 定义一个属性被删除时的行为 注意: def __setattr__(self, name, value): self.name = value + 1 #此代码试

Python3 魔法方法:迭代器

0.什么是迭代器 迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据) 在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问 1.相关的BIF iter() 将一个可迭代对象转换成一个迭代器 next() 访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常 2.魔法方法 __iter__(self) 返回迭代器本身 __next__(self) 决定迭代的方法 3.例题: 用while语句实现

魔法方法之自定义序列

自定义序列 自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等). 因为如果要定制容器类型的话需要用到这些协议.首先,实现不变容器的话有一个协议:实现不可变容器,你只能定义__len__ 和 __getitem__ (一会会讲更多).可变容器协议则需要所有不可变容器的所有另外还需要 __setitem__ 和 __delitem__ .最终,如果你希望你的对象是可迭代的话,你需要定义 __iter

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

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g

课时44:魔法方法:简单定制

目录: 一.简单定制 二.课时44课后习题及答案 **************** 一.简单定制 **************** 基本要求:1>> 定制一个计时器的类2>> start和stop方法代表启动计时和停止计时3>> 假设计时器对象t1,print(t1)和直接调用t1均显示结果4>> 当计时器未启动或已经停止计时,调用stop方法会给予温馨的提示5>> 两个计时器对象可以进行相加:t1 + t26>> 只能使用提供的有限

【Python047-魔法方法:定制序列】

一.协议是什么 1.协议(protocols)与其他编程语言中的接口很相似,它规定你那些方法必须要定义.然而在Python中协议就显的不那么正式,事实上,在Python中,协议更像是一种指南 2.容器类型的协议 ** 如果你希望定制的容器是不可变的话,那你只需要定义__len__(),和__getitem__()方法 ** 如果你希望定制的容器是可变的话,那你除了定义__len__() 和__getitem__()方法外,还需要定义__setitem__()和 __delitem__()两个方法

python3 与dict相关的魔法方法。使用于二叉搜索树的类中

Python的魔术方法一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__. __setitem__(subscriptable所需method), __delitem__(del obj[key]所需method), __len__(len(…)所需method)等. 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟.