我知道这个问题听起来非常基本。但我无法使用Google找到它。我知道有些字典看起来像
o = {
'a': 'b'
}
并使用o['a']
访问它们。但是被称为o.a
时被访问的是什么?我知道它们存在是因为我使用的是optparse库,它返回一个可以访问的对象。
答案 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__
可以看出它们非常相似,只是在找不到目标时引发的异常不同。