zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    css3实现酷炫的3D盒子翻转效果
    Java源码学习:HashMap实现原理
    mac 如何显示隐藏文件和.点开头文件?
    mac 下 安装 mongodb 数据库
    WPF 自定义TextBox
    Appium+Python 安卓APP自动化测试:安装app和卸载app
    Appium+Python 安卓APP自动化测试:环境搭建与基础操作
    DataFrame利用函数或映射进行数据转换map
    TypeError: drop_duplicates() got an unexpected keyword argument 'take_last'
    DataFrame合并:合并重叠数据combine_first
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/8436708.html
Copyright © 2011-2022 走看看