什么是 dict 类?它用于什么?

4
有人能解释一下dict类是用来干什么的吗?这段代码来自于《Python深入浅出》。
class FileInfo(dict):                  
    "store file metadata"
    def __init__(self, filename=None): 
        self["name"] = filename

我理解使用self['name'] = filename来分配键值对,但是这与继承dict类有什么关系呢?请帮我理解。

3个回答

3
如果您不熟悉面向对象编程中的继承概念,请至少查看维基百科文章(虽然这只是介绍,可能不是最好的)。在Python中,我们使用以下语法将类A定义为类B的子类:
class A(B):
  pass # empty class

在您的示例中,由于FileInfo类继承自标准dict类型,因此您可以将该类的实例用作字典(因为它们具有常规dict对象具有的所有方法)。除其他事项外,这使您可以按键分配值(dict提供了处理此操作的方法):
self['name'] = filename

您需要的是这个解释还是您还有其他不理解的地方?


@KL-7--你能提供一个从dict继承的不同子类的例子吗?在实践中如何使用它? - dopatraman
жҲ‘и®Өдёәдәә们еҫҲе°‘еҲӣе»әdictжҲ–е…¶д»–еҶ…зҪ®зұ»еһӢзҡ„еӯҗзұ»пјҢдҪҶжҳҜиҝҷйҮҢжңүдёҖдёӘжңүеәҸеӯ—е…ёзҡ„е®һзҺ°гҖӮжӯЈеҰӮжӮЁеҸҜд»ҘеңЁжәҗд»Јз ҒдёӯзңӢеҲ°зҡ„йӮЈж ·пјҢOrderedDictзұ»жҳҜdictзұ»еһӢзҡ„еӯҗзұ»гҖӮ - KL-7

1

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

因此,当FileInfo继承dict时,这意味着dict类的所有功能现在都可用于FileInfo,除了FileInfo可能声明或更重要的是通过重新定义方法或参数来覆盖的内容。

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


@tkone--继承dict对象对于键值对是强制性的吗?难道不是每个Python对象都具备这种能力吗? - dopatraman
2
不,那是JavaScript :)。Python对象具有可以通过“点”符号(test.parameter)访问的属性。dict是一个关联数组,您可以使用相关键访问值。尝试在Python中实例化一个对象,并像访问关联数组一样访问它test['parameter']。您将获得TypeError:'Test' object is not subscriptable.现在创建一个字典,并尝试通过“点”符号访问它。您将获得AttributeError:'dict' object has no attribute N - tkone

1

这是用于创建自定义字典类型的。

您可以覆盖__init____getitem____setitem__方法,以扩展字典的使用。

阅读《深入Python》文本中的下一节:我们使用这种继承方式来能够像使用普通字典一样处理文件信息。

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

fileinfo类的设计方式是在其构造函数中接收文件名,然后让用户以与从普通字典获取值的方式相同的方式获取文件信息。

这样一个类的另一个用途是创建控制其数据的字典。例如,您想要一个字典,在将内容分配给其“sensor”键或从其读取时执行特殊操作。您可以定义自己的特殊__setitem__函数,该函数对键名敏感:

def __setitem__(self, key, item):
    self.data[key] = item
    if key == "sensor":
        print("Sensor activated!")

例如,您想每次用户读取“温度”键时返回特殊值。为此,您可以子类化一个__getitem__函数:
def __getitem__(self, key):
    if key == "temperature":
        return CurrentWeatherTemperature()
    else:
        return self.data[key]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接