我正在尝试创建一个Var_Dump类,我可以这样做:
vd.attribute = value
和
print vd.attribute
所以,这是代码:
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
但是我收到了这个错误:
File "classAsVarDump.py", line 9, in __getattr__
if not item in self.dump: return ""
RuntimeError: maximum recursion depth exceeded
答案 0 :(得分:2)
self.dump={}
调用__setattr__
设置dump
,调用__getattr__
让dump
放入dump
,调用__getattr__
1}}获取dump
等。您可以使用object.__setattr__
解决此问题,但更简单的方法是执行此操作:
class Namespace(object):
def __getattr__(self, attr):
return ''
仅当通过常规方法找不到属性时才会调用 __getattr__
,因此不需要处理查找实际已设置的属性。
答案 1 :(得分:2)
在Python 3.3中,改为使用新的types.SimpleNamespace()
type:
>>> from types import SimpleNamespace
>>> vd = SimpleNamespace()
>>> vd.foo = 'bar'
>>> print(vd.foo)
bar
该文档在盘片上为您提供了向后兼容的版本:
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))
您的版本与此版本之间的唯一区别是此版本不使用__setattr__
和__getattr__
(根本不需要),此版本在初始化程序中采用初始值,并且包括一个很好的代表:
>>> vd
namespace(foo='bar')
答案 2 :(得分:0)
无需覆盖__setattr__
或__getattr__
>>> class VarDump(object):
... pass
...
>>> c = VarDump()
>>> c.bar = 2
>>> print c.bar
2