python OrderedDefaultDict 的实现

转载 2016年08月31日 10:54:31
class OrderedDefaultDict(collections.OrderedDict):
    def __init__(self, *args, **kwargs):
        if not args:
            self.default_factory = None
        else:
            if not (args[0] is None or callable(args[0])):
                raise TypeError('first argument must be callable or None')
            self.default_factory = args[0]
            args = args[1:]
        super(OrderedDefaultDict, self).__init__(*args, **kwargs)

    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = defualt = self.default_factory()
        return default

    def __reduce__(self):
        args = (self.default_factory,) if self.default_factory else ()
        return self.__class__, args, None, None, self.iteritems()

__missing__():

missing 主要是defaultdict类中实现默认值的功能,
使用

print defaultdict.__missing__.__doc__

missing(key)
if self.default_factory is None: raise KeyError(key)
self[key] = value = self.default_factory()
return value

通过查看_ _ missing _ ()方法的docstring, 可以看出,当使用 _ getitem _ 方法访问一个不存在的键的时候,会调用 _ missing _ _ 方法来获取默认值,并将该值添加到字典中去

而且查看官方文档发现,

If a subclass of dict defines a method missing() and key is not present, the d[key] operation calls that method with the key key as argument. The d[key] operation then returns or raises whatever is returned or raised by the missing(key) call. No other operations or methods invoke missing(). If missing() is not defined, KeyError is raised. missing() must be a method; it cannot be an instance variable:

虽然dict支持 miss 方法,但是该方法在dict本身是不存在的,而是需要在派生的子类中自行实现这个方法,可以简单的验证这一点:

print dict.__missing__.__doc__

同时,我们可以进一步的做实验,定义一个子类,并且实现 missing方法

class Missing(dict)
    def __missing__(self, key):
        return 'missing'

d = Missing()
>>>d
{}
>>>d['foo']
'missing'
>>>d
{}

返回结果反映了,missing方法确实发挥了作用,在此基础上,我们稍作修改就可以使得该子类同defaultdict类一样为不存在的键设置一个默认值

__reduce__self

当定义扩展类型的时候(也就是使用python的C语言API实现的类型), 如果你想要pickle(持久化对象)它们,你必须告诉python如何pickle它们,reduce被定义之后,当对象被pickle的时候就会被调用,它要么返回一个代表全局名称的字符串,python会查找它并且pickle,要么返回一个元组,这个元组包含2到5个元素,其中包括:一个可调用对象,用于重建对象的时候调用,一个参数元素,供那个可调用对象使用,被传递给 _ _ setstate _ _ 的状态(可选); 一个产生被pickle的列表元素的迭代器(可选) 一个产生pickle的字典元素的迭代器

SVM 基本概念及Python实现方式

SVM(support vector machine)支持向量机: 注意:本文不准备提到数学证明的过程,一是因为有一篇非常好的文章解释的非常好:http://blog.csdn.net/v_july_...
  • jerry81333
  • jerry81333
  • 2016年11月16日 09:55
  • 2920

knn算法python实现

K最近邻(k-Nearest Neighbor,KNN)分类算法思路: 如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法还可用于回归。方法是通过...
  • u013593585
  • u013593585
  • 2016年04月29日 22:30
  • 2257

SVM全系列:从原理到python实现(一):SVM原理

前言 本文开始主要介绍一下SVM的分类原理以及SVM的数学导出和SVM在Python上的实现。借鉴了许多文章,会在后面一一指出,如果有什么不对的希望能指正。   一、 SVM简介 首先看到SV...
  • woaidapaopao
  • woaidapaopao
  • 2016年09月25日 22:51
  • 5454

Python实现Socket服务器代码

  • 2018年01月14日 16:59
  • 1KB
  • 下载

python-简单的ATM界面实现

  • 2018年01月13日 20:16
  • 16KB
  • 下载

机器学习KNN算法的Python实现

  • 2018年01月12日 11:57
  • 4KB
  • 下载

pycharm工程python调用OpenCV实现USB摄像头实时人脸检测

  • 2018年01月16日 16:32
  • 88KB
  • 下载

用Python实现网络爬虫、蜘蛛.doc

  • 2018年01月13日 15:51
  • 657KB
  • 下载

OpenCV3计算机视觉+Python语言实现 代码

  • 2018年01月10日 17:17
  • 52.05MB
  • 下载

Python实现答题的自动搜索

  • 2018年01月18日 10:23
  • 672B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python OrderedDefaultDict 的实现
举报原因:
原因补充:

(最多只允许输入30个字)