你如何在python中访问哈希?

时间:2011-04-03 05:48:59

标签: python hash

我知道这个问题听起来非常基本。但我无法使用Google找到它。我知道有些字典看起来像

o = {
  'a': 'b'
}

并使用o['a']访问它们。但是被称为o.a时被访问的是什么?我知道它们存在是因为我使用的是optparse库,它返回一个可以访问的对象。

5 个答案:

答案 0 :(得分:2)

您无法使用'。'访问dicts。除非你通过从dict派生并通过'。'提供访问来实现你自己的dict类型。通过实施负责执行属性样式访问的__getattribute__() API来表示法。

请参阅http://docs.python.org/reference/datamodel.html#object.__getattribute__

答案 1 :(得分:2)

在我看来,optparse模拟了一个隐藏dict的属性接口,但是有一个标准库可以做一些类似的,如果不是真正的字典:collections.namedtuple。我不能谈论这里介绍的其他机制。

答案 2 :(得分:1)

您可以在“新样式类”中将变量作为字典访问。我想你必须要小心一点。

>>> class C(object): # python 2 code, inheriting from 'object' is automatic in 3
    a = 5
    def __init__(self):
        self.j = 90


>>> c = C()
>>> c.__dict__
{'j': 90}
>>> print c.j
90
>>> print c.a
5

注意'j'出现在字典中,'a'没出现。它看起来与它们的初始化方式有关。我对这种行为感到有些困惑,并且不介意大师的解释:D

修改

多做一些游戏,很明显为什么他们决定采取上述行为(但它仍然有点奇怪

>>> class C(object):
    a = 5
    def __init__(self):
        self.j = 90
        self.funct = range # assigning a variable to a function

>>> c = C()
>>> c.__dict__
{'j': 90, 'funct': <built-in function range>}

我认为它将类对象(对于每个类都是相同的)与新的类成员(例如在 init 中启动的那些成员)分开。如果我现在做

>>> c.newvar = 234
>>> c.__dict__
{'j': 90, 'newvar': 234, 'funct': <built-in function range>}

你可以看到它正在建立一本字典!希望这有助于:D

答案 3 :(得分:0)

name.attribute是Python中的对象访问,而非 dict access

答案 4 :(得分:0)

__getattr__是您要实施的方法,以及__setattr__。这是一个非常简单的示例(没有错误检查等),它显示了一个允许字典样式和属性样式访问的对象:

Missing = object()

class AttrElem(object):
    def __init__(self, **kwds):
        self.items = kwds.copy()
    def __getitem__(self, name):
        result = self.items.get(name, Missing)
        if result is not Missing:
            return result
        raise KeyError("key %r not found" % name)
    def __setitem__(self, name, value):
        self.items[name] = value
    def __getattr__(self, name):
        result = self.items.get(name, Missing)
        if result is not Missing:
            return result
        raise AttributeError("attribute %r not found" % name)
    def __setattr__(self, name, value):
        if name == 'items':
            object.__setattr__(self, name, value)
        else:
            self.items[name] = value
    def __repr__(self):
        return 'AttrElem(%s)' % ', '.join(
                ["%s:%s" % (k, v) for k, v in self.items.items()]
                )

在使用中它看起来像这样:

example = AttrElem(this=7, that=9)
print(example)
example.those = 'these'
example['who'] = 'Guido'
print(example)

从代码__getitem____getattr__可以看出它们非常相似,只是在找不到目标时引发的异常不同。