当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Python魔法方法 容器部方法详解

    栏目:Linux/apache问题 时间:2020-01-03 19:11

    这篇文章主要介绍了Python魔法方法 容器部方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    为了加深印象,也为了以后能够更好的回忆,还是记录一下。

    序列(类似集合,列表,字符串),映射(类似字典)基本上是元素的集合,要实现他们的基本行为(协议),不可变对象需要两个协议,可变对象需要4个协议。

    __len__(self):返回元素的数量,(为不可变对象需要的协议之一)=====> len __iter__返回一个迭代器,具有了__next__方法后,给for使用。 __contains__ 代表 in的意思 xx.__contains__ (22) ==>22 in xx一个效果 __getitem__(self, key)或者__getitem__(self, index), 返回执行输入所关联的值(为不可变对象需要的协议之一) __setitem__(self, key, values) 或者 __setitem__(self, index, values) , 设置指定输入的值对应的values __delitem__ (self, key) 删除指定key的值 __missing__这个有意思,跟__getattr__有的一比,是找不到这个key,触发条件。前面用列表测试了,晕死了(只对字典有效。) __del__, 析构函数当这个类不存在实例对象时执行。

    下面我编写一个自定义类似列表的类,实例后该类默认前面有10个None参数,且不能删除前面5个空None。(随口说的,开始写了)

    def check_index(index):
      if index < 5:
        raise IndexError('index must greater than 10')
     
     
    class S_List:
      def __init__(self):
        self.ll = [None] * 10
     
      def __len__(self): # 提取参数长度
        return len(self.ll)
     
      def __getitem__(self, index): # 取出参数
        return self.ll[index]
     
      def __setitem__(self, index, value): # 设置参数
        check_index(index)
        self.ll[index] = value
     
      def __delitem__(self, index):
        check_index(index)
        self.ll.pop(index)
     
      def __str__(self): # 打印对象时,输出列表本身
        return str(self.ll)
     
      def __del__(self): # 没有手工删除在程序结束时释放
        print('我被释放了!')
     
    sl = S_List()
    del sl[3]
     
    print(isinstance(sl, S_List))
    print(f'输出原始数据:{sl}')
    sl[6] = 'six'
    print(f'修改后原始数据:{sl}')
    print(f'随便取一个值:{sl[1]}')
    del sl[6]
    print(f'第二次修改后原始数据:{sl}')
    del sl[3]
    # sl[4] = 'oh'
    print(sl)

    正常输出:

    True
    输出原始数据:[None, None, None, None, None, None, None, None, None, None]
    修改后原始数据:[None, None, None, None, None, None, 'six', None, None, None]
    随便取一个值:None
    第二次修改后原始数据:[None, None, None, None, None, None, None, None, None]
    [None, None, None, None, None, None, None, None, None]
    我被释放了!

    报错提示:

    Traceback (most recent call last):
     File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 81, in <module>
      del sl[3]
     File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 73, in __delitem__
      check_index(index)
     File "/Users/shijianzhong/Desktop/yunzuan_buy/study_base.py", line 53, in check_index
      raise IndexError('index must greater than 10')
    IndexError: index must greater than 10
    我被释放了!

    这个是自定义的一个基本没有什么方法的伪字典,不能增加元素,而且index,count等方法由于没有写入都无法使用。

    好的方式是可以继承list或者dict的类,在里面对需要的条件进行修改限制,这样的话,实例出来的对象可以继承原来的全部方法。