Python: Class as var dump error
本问题已经有最佳答案,请猛点这里访问。
我正在尝试创建一个vardump类,在这里我可以做到:
1 | vd.attribute = value |
和
1 | print vd.attribute |
所以,这就是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class VarDump: def __init__(self): self.dump={} def __setattr__(self,item,var): self.dump[item]=var def __getattr__(self,item): if not item in self.dump: return"" return self.dump[item] vd = VarDump() vd.foo="bar" print vd.foo |
但我得到了这个错误:
1 2 3 | File"classAsVarDump.py", line 9, in __getattr__ if not item in self.dump: return"" RuntimeError: maximum recursion depth exceeded |
在python 3.3中,使用新的
1 2 3 4 5 | >>> from types import SimpleNamespace >>> vd = SimpleNamespace() >>> vd.foo = 'bar' >>> print(vd.foo) bar |
文档提供了盘片上向后兼容的版本:
1 2 3 4 5 6 7 | class SimpleNamespace: def __init__(self, **kwargs): self.__dict__.update(kwargs) def __repr__(self): keys = sorted(self.__dict__) items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) return"{}({})".format(type(self).__name__,",".join(items)) |
您的版本和这个版本的唯一区别是,这个版本不使用
1 2 | >>> vd namespace(foo='bar') |
1 2 3 | class Namespace(object): def __getattr__(self, attr): return '' |
只有在通过常规方法找不到属性时才调用
无需覆盖
1 2 3 4 5 6 7 | >>> class VarDump(object): ... pass ... >>> c = VarDump() >>> c.bar = 2 >>> print c.bar 2 |