2012-01-03 63 views
4

有人可以解释什么dict类用于?这个片段是从深入Python什么是dict类用于

class FileInfo(dict):     
    "store file metadata" 
    def __init__(self, filename=None): 
     self["name"] = filename 

我明白key = value对与self['name'] = filename分配但到底是什么继承dict类与此有关?请帮助我理解。

回答

1

它用于创建自己的自定义字典类型。

您可以覆盖__init__,__getitem____setitem__方法为您自己的特殊目的扩展字典的用法。

阅读Dive into Python文本中的下一节:我们使用这种继承来处理文件信息,就像我们使用普通字典一样。

# From the example on the next section 
>>> f = fileinfo.FileInfo("/music/_singles/kairo.mp3") 
>>> f["name"] 
'/music/_singles/kairo.mp3' 

fileinfo类的设计,它在它的构造函数接收文件名的方式,然后让用户获取文件信息,只是你从一个普通的字典中获取值的方式。

这种类的另一个用法是创建控制其数据的字典。例如,你需要一个字典,当事物被分配时,它会做一件特殊的事情,或者从其“传感器”键读取。你可以定义特殊功能__setitem__这与键名敏感:

​​

或者比如你要返回一个特殊值,每次用户读取“温度”键。为此,您继承了__getitem__函数:

def __getitem__(self, key): 
    if key == "temperature": 
     return CurrentWeatherTemperature() 
    else: 
     return self.data[key] 
3

如果您不熟悉面向对象编程的继承概念,至少在this维基文章(尽管,这只是为了介绍,可能不是最好的)。

在Python中,我们使用这个语法定义A类作为B类的子类:

class A(B): 
    pass # empty class 

在你的榜样,为FileInfo类是从标准dict类型继承你可以使用这个类的实例作为字典(因为它们具有常规的dict对象所具有的所有方法)。除此之外,您可以通过这样的键赋值其他事情(dict用于发放该操作提供方法):

self['name'] = filename 

是这样的解释你想要或你不明白什么东西?

+0

@ KL-7 - 您是否介意提供从'dict'继承的子类的不同示例?如何在实践中使用这个? – dopatraman 2012-01-03 17:35:41

+0

我不认为人们经常创建'dict'或其他内置类型的子类,但是[here](http://www.voidspace.org.uk/python/odict.html)是有序字典的实现。正如你可以在[source](http://www.voidspace.org.uk/downloads/odict.py)中看到的那样,OrderedDict类是'dict'类型的一个子类。 – 2012-01-03 18:37:53

1

当Python中的类继承另一个类时,这意味着在继承的类上定义的任何方法本质上都是在新创建的类上定义的。

所以当FileInfo继承dict这意味着所有的dict类的功能现在可以FileInfo,除了任何FileInfo可以通过重新定义方法或参数声明,或更重要的是,重写。

由于Python中的对象dict允许键/值名称对,因此这使得FileInfo可以访问相同的机制。

+0

@ tkone - 是否继承了键值对强制使用的'dict'对象?不是每个python对象都有这个能力吗? – dopatraman 2012-01-03 17:59:52

+2

不,这就是JavaScript :)。 Python对象具有可以通过“点”符号('test.parameter')访问的属性。 'dict'是一个关联数组,您可以使用关联的键访问这些值。尝试在Python中实例化一个对象,并像访问数组'test ['parameter']'一样访问它。你会得到'TypeError:'Test'对象不是可代码化的.'现在制作一个字典并尝试通过'点'符号来访问它。你会'AttributeError:'dict'对象没有属性N' – tkone 2012-01-03 20:03:48