澳门1495

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

七月 17th, 2019  |  澳门1495

问题

尝试楼python挑衅赛1
落到实处一个不可变的dict,数据只可以由类伊始化的时候经过参数字传送递,修改、加多都会抛出TypeError

前言

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

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

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

澳门1495 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.澳门1495,getitem中定义的万分
pop 也就很临近了。

Collection接口、子接口以及贯彻类

Collection接口

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

  • 概念了可用来操作List、Set和Queue的艺术-增加和删除改查

Collection接口API中定义的格局如下:

澳门1495 2

image.png

List接口

  • List是因素有序何况能够重新的会晤,被称得上体系

  • List能够精确的调节每一种成分的插入地方,或删除某些地方成分

  • List接口的常用子类:

    ArrayList

    LinkedList

    Vector

    Stack

下图是List的JDK源码UML图。

澳门1495 3

image.png

Set接口

  • Set接口中不能加盟重复成分,冬天

  • Set接口常用子类:

    散列存放:HashSet

    长久以来寄放:TreeSet

下图是Set的JDK源码UML图。

澳门1495 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图

澳门1495 5

image.png

Comparable和Comparator

Comparable接口——可正如的

  • 贯彻该接口表示:这一个类的实例能够相当的大小,能够拓展自然排序

  • 概念了默许的相比准则

  • 事实上现类需求完结compareTo()方法

  • compareTo()方法重回正数表示大,负数表示小0代表特别

Comparator接口——比较工具接口

  • 用来定义有的时候相比较准绳,并不是暗中同意相比准则

  • 实质上现类必要实现compare()方法

  • Comparable和Comparator都以Java群集框架的分子

Iterator接口

  1. 集聚输出的正统操作

    职业做法,使用Iterator接口

  2. 操作原理:

    Iterator是专程的迭代输出接口,迭代出口就是将成分一个个进行判断,剖断其是不是有内容,即便有内容则把内容抽出。

总结

聚拢的功用

  • 在类的个中,对数据开始展览集体;

  • 简言之而火速的探求大数量的条目款项;

  • 一对集合接口,提供了一文山会海排列有序的因素,而且可以在连串中间神速的插入恐怕去除有关因素;

  • 一部分会集接口,提供了炫丽关系,能够透过重大字(key)去快捷寻觅对应的独步一时指标,而这几个主要字额能够是自由档案的次序。

与数组的争辨统一—————为什么选拔集合并不是数组

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

  • 数组只好通过下标访谈成分,类型定位,而有的集结能够由此自由层次查找所映射的具体对象。

收拾的会晤框架思维导图

澳门1495 6

image.png


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

Your Comments

近期评论

    功能


    网站地图xml地图