0

我从 Alchin 'pro python' 书中写了一个类似“AttributeDict”的对象(下面几乎直接取自书中。我的目标是创建一个配置对象,其中配置字段可以作为类属性访问)。

class ADict(dict):
    def __setattr__(self,key,value):
        self[key] = value
    def __getattr__(self,key):
        return self[key]

当我尝试访问文档时,我得到一个 TypeError,与缺少的 __name__ 属性有关(下面的示例)。

>>> z = ADict()
>>> help(z)
line 1531, in doc
pager(render_doc(thing, title, forceload))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pydoc.py",   line 1505, in render_doc
object, name = resolve(thing, forceload)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pydoc.py", line 1500, in resolve
name = getattr(thing, '__name__', None)
File "attributeConfig.py", line 26, in __getattr__
return self[key]
KeyError: '__name__'

这里发生了什么?对我来说,这个 __name__ 的去向并不明显(以及它在 pydoc 代码中的使用方式)。

4

1 回答 1

0

您需要确保AttributeError在找不到属性时引发 an:

class ADict(dict):

    def __setattr__(self,key,value):
        self[key] = value

    def __getattr__(self,key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError

这将首先在字典中查找属性。如果它在那里,请将其退回。否则,使用 raise anAttributeError来指示该属性不存在。

于 2014-08-26T14:30:32.447 回答