Python 使用类似于_ugetattr _;但是的对象Dict

Python 使用类似于_ugetattr _;但是的对象Dict,python,Python,我想清理大量使用此类的代码: class ADict(object): pass #example usage a = ADict() a.attr = 1 我想做的是保留\uuu getattr\uuuu符号,但添加一个构造函数参数,它是一个允许的ADict键列表,也在\uuu getattr\uuuuu和\uu setattr\uuuuuu中签入。除了这是否是一个好主意,它是否可行?怎么用?以下是我失败的尝试(由于无限递归而无法工作): 您要查找的是插槽魔术变量。基本上,如果您定义了它

我想清理大量使用此类的代码:

class ADict(object):
  pass
#example usage
a = ADict()
a.attr = 1
我想做的是保留
\uuu getattr\uuuu
符号,但添加一个构造函数参数,它是一个允许的ADict键列表,也在
\uuu getattr\uuuuu
\uu setattr\uuuuuu
中签入。除了这是否是一个好主意,它是否可行?怎么用?以下是我失败的尝试(由于无限递归而无法工作):


您要查找的是插槽魔术变量。基本上,如果您定义了它,您将限制给定对象可以具有的属性:

class ADict:
    __slots__ = ['foo', 'bar', 'baz']

a = ADict()
a.foo = 1             # this will work

a.another_thing = 1   # this will throw an AttributeError

但是,在实现此功能之前,请仔细阅读文档,因为除非您的应用程序有非常严格的内存要求,否则这通常不是一个好主意。

如果attr不在object中。
-如果attr不在self.keys中,为什么不干脆
?你能提供一个包含回溯的方法吗?试试
namedtuple
?@jornsharpe:回溯只是说已经达到了递归限制。我试图避免写“self.keys”,但现在我发现我还是写了。@shx2好主意,但它不允许我以后更改键。你为什么试图避免
self.keys
?这就是您所设置的属性。只是强调一下,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
旨在用于节省内存,并且有一些注意事项。例如,如果类使用
\uuuuu slots\uuuu
,则不能使用类变量的常用习惯用法为实例变量提供默认值。请务必在使用前阅读文档。@SergeBallesta:这只在我的笔记本电脑上的Py2中有效。
class ADict:
    __slots__ = ['foo', 'bar', 'baz']

a = ADict()
a.foo = 1             # this will work

a.another_thing = 1   # this will throw an AttributeError