get 跳转到了Mapping中的get

问题

试验楼python挑衅赛壹兑现三个不可变的dict,数据只可以由类伊始化的时候经过参数字传送递,修改、增添都会抛出TypeError

前言

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

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

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

图片 1

image.png

消除措施

此伏彼起ABCs中的MultiMapping, 复写个中的1部分方法就可以。

正文

看上边包车型客车框架图,先抓住它的着力,即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是专门的迭代输出接口,迭代出口就是将成分2个个拓展判定,判定其是不是有内容,假若有内容则把内容抽出。

总结

集聚的效益

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

  • 简易而飞快的探求大数指标条文;

  • 有的集合接口,提供了一层层排列有序的成分,并且能够在序列中间神速的插入大概去除有关因素;

  • 有些集结接口,提供了绚烂关系,能够因此注重字(key)去神速搜索对应的唯一指标,而以此器重字额能够是轻巧档案的次序。

与数组的自己检查自纠—————为什么选取会集而不是数组

  • 数组的尺寸固定,集结长度可变

  • 数组只可以通过下标访问成分,类型定位,而一些集结能够因此随机档案的次序查找所映射的现实性对象。

重新整建的集纳框架思维导图

图片 6

image.png


原版的书文链接:http://www.jianshu.com/p/5dcb98e4b3d2

相关文章