Python:类作为var转储错误

时间:2013-07-30 19:55:30

标签: python variables

我正在尝试创建一个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

3 个答案:

答案 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