get威尼斯人娱乐 跳转到了Mapping中的get

问题

尝试楼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

相关文章