澳门1495

聚拢总体大纲,不可变的字典类

二月 9th, 2019  |  澳门1495

问题

尝试楼python挑衅赛1
贯彻一个不可变的dict,数据只好由类伊始化的时候经过参数传递,修改、添加都会抛出TypeError

前言

Java集合是java提供的工具包,蕴含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包地点是java.util.*

Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。

Java集合工具包框架图(如下):

图片 1

image.png

缓解格局

持续ABCs中的MultiMapping, 复写其中的一对方法即可。

正文

看上边的框架图,先抓住它的主导,即Collection和Map。

代码

import collections


class ImmutableDict(collections.MutableMapping):
 def __init__(self, **kwargs):
     self.store = dict(**kwargs)
     self.error = TypeError("'ImmutableDict' objects are immutable")
     # self.update(dict(*args, **kwargs))

 def __setitem__(self, key, value):
     # 涉及到修改时会触发这个方法
     raise self.error

 def __iter__(self):
     return iter(self.store)

 def __delitem__(self, key):
     # 删除时触发
     raise self.error

 def __getitem__(self, key):
     return self.store[key]

 def __len__(self):
     return len(self.store)


class Get(object):
 def __init__(self):
     pass

 def __getitem__(self, item):
     return hash(item)


if __name__ == "__main__":
 test = ImmutableDict(name="sun", age=22, location="China")
 # test["name"] = "zhang"
 # test.pop("name")   TypeError will raised..
 # print(test.pop("name"))
 # for item in test:
     # print(item)
     #print(test[item])

MultiMapping 源码:

class MutableMapping(Mapping):

    @abstractmethod
    def __setitem__(self, key, value):
        raise KeyError

    @abstractmethod
    def __delitem__(self, key):
        raise KeyError

    __marker = object()

    def pop(self, key, default=__marker):
        try:
            value = self[key]
        except KeyError:
            if default is self.__marker:
                raise
            return default
        else:
            del self[key]
            return value

    def popitem(self):
        try:
            key = next(iter(self))
        except StopIteration:
            raise KeyError
        value = self[key]
        del self[key]
        return key, value

    def clear(self):
        try:
            while True:
                self.popitem()
        except KeyError:
            pass

    def update(self, other=(), **kwds):
        if isinstance(other, Mapping):
            for key in other:
                self[key] = other[key]
        elif hasattr(other, "keys"):
            for key in other.keys():
                self[key] = other[key]
        else:
            for key, value in other:
                self[key] = value
        for key, value in kwds.items():
            self[key] = value

    def setdefault(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            self[key] = default
        return default

MutableMapping.register(dict)

Mapping 源码:

class Mapping(Sized, Iterable, Container):

    @abstractmethod
    def __getitem__(self, key):
        raise KeyError

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def __contains__(self, key):
        try:
            self[key]
        except KeyError:
            return False
        else:
            return True

    def iterkeys(self):
        return iter(self)

    def itervalues(self):
        for key in self:
            yield self[key]

    def iteritems(self):
        for key in self:
            yield (key, self[key])

    def keys(self):
        return list(self)

    def items(self):
        return [(key, self[key]) for key in self]

    def values(self):
        return [self[key] for key in self]

    # Mappings are not hashable by default, but subclasses can change this
    __hash__ = None

    def __eq__(self, other):
        if not isinstance(other, Mapping):
            return NotImplemented
        return dict(self.items()) == dict(other.items())

    def __ne__(self, other):
        return not (self == other)

解析多少个难点:

  • .get 的时候到底暴发了怎么?
  • .pop 的时候发出了什么?

尝试举行断点调试:

尝试

get 跳转到了Mapping中的get

image.png

image.png

只顾其中的self就是大家实例化的immutableDict类

结论:
.get突显定义是在Mapping中,但是Mapping又把这么些主意的已毕抛给了子类,事实上,就是调用了
immutableDict.getitem中的方法。
从而大家在get 会触发大家在 immutableDict.getitem中定义的充足
pop 也就很类似了。

Collection接口、子接口以及落实类

Collection接口

  • 是List、Set和Queue接口的父接口

  • 概念了可用以操作List、Set和Queue的章程-增删改查

Collection接口API中定义的措施如下:

图片 2

image.png

List接口

  • List是因素有序并且可以重新的集合,被称呼连串

  • List可以规范的决定每个元素的插入地方,或删除某个地点元素

  • List接口的常用子类:

    ArrayList

    LinkedList

    Vector

    Stack

下图是List的JDK源码UML图。

图片 3

image.png

Set接口

  • Set接口中不可以加入重复元素,无序

  • Set接口常用子类:

    散列存放:HashSet

    一如既往存放:TreeSet

下图是Set的JDK源码UML图。

图片 4

image.png

Map和HashMap

Map接口

  • Map提供了一种炫耀关系,其中的因素是以键值对(key-value)的格局储存的,可以完结基于key急迅搜索value

  • Map中的键值对以Entry类型的靶子实例格局存在

  • 键(key值)不可重复,value值可以

  • 各种建最七只好照射到一个值

  • Map接口提供了各自再次来到key值集合、value值集合以及Entry(键值对)集合的不二法门

  • Map匡助泛型,格局如:Map<K,V>

HashMap类

  • HashMap是Map的一个主要完成类,也是最常用,基于哈希表完成

  • HashMap中的Entry对象是无序排列的

  • Key值和Value值都可以为null,不过一个HashMap只好有一个key值为null的投射(key值不可重复)

下图是Map的JDK源码UML图

图片 5

image.png

Comparable和Comparator

Comparable接口——可正如的

  • 贯彻该接口表示:这一个类的实例可以相比较大小,可以拓展自然排序

  • 概念了默许的可比规则

  • 事实上现类要求贯彻compareTo()方法

  • compareTo()方法重返正数表示大,负数表示小0代表分外

Comparator接口——相比较工具接口

  • 用于定义临时比较规则,而不是默许相比较规则

  • 实则现类必要完成compare()方法

  • Comparable和Comparator都是Java集合框架的分子

Iterator接口

  1. 聚拢输出的规范操作

    专业做法,使用Iterator接口

  2. 操作原理:

    Iterator是特其余迭代输出接口,迭代出口就是将元素一个个展开判断,判断其是或不是有内容,如若有内容则把内容取出。

总结

聚集的效益

  • 在类的里边,对数码进行团队;

  • 简不难单而高速的搜寻大数目标条规;

  • 一些集合接口,提供了一密密麻麻排列有序的要素,并且可以在连串中间飞速的插入或者去除有关因素;

  • 一些集合接口,提供了炫耀关系,可以因而重点字(key)去快捷搜索对应的唯一目的,而那一个重中之重字额可以是不管三七二十一档次。

与数组的相比—————为啥选取集合而不是数组

  • 数组的长短固定,集合长度可变

  • 数组只可以通过下标访问元素,类型定位,而有的集合能够由此自由档次查找所映射的切实可行对象。

重整的汇聚框架思维导图

图片 6

image.png


原稿链接:http://www.jianshu.com/p/5dcb98e4b3d2

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图