我在Alchin' pro python'中写了一个"属性和类似对象? book,(下面几乎直接来自本书。我的目标是创建一个配置对象,其中配置字段可作为类属性访问)。
class ADict(dict):
def __setattr__(self,key,value):
self[key] = value
def __getattr__(self,key):
return self[key]
当我尝试访问文档时,我得到一个与错误的__name__属性相关的TypeError(下面的示例)。
>>> 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代码中的使用方式)并不明显。
答案 0 :(得分:0)
当找不到属性时,您需要确保引发AttributeError
:
class ADict(dict):
def __setattr__(self,key,value):
self[key] = value
def __getattr__(self,key):
try:
return self[key]
except KeyError:
raise AttributeError
这将首先在字典中查找属性。如果它在那里,返回它。否则,使用引发AttributeError
表示该属性不在那里。