关于变量:Python:Class as var dump error

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中,使用新的types.SimpleNamespace()类型:

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))

您的版本和这个版本的唯一区别是,这个版本不使用__setattr____getattr__(根本不需要),这个版本在初始值设定项中采用初始值,它包括一个很好的表示:

1
2
>>> vd
namespace(foo='bar')


self.dump={}调用__setattr__来设置dump,它调用__getattr__来让dumpdump放入,它调用__getattr__来获取dump等,你可以用object.__setattr__来解决这个问题,但更简单的方法是:

1
2
3
class Namespace(object):
    def __getattr__(self, attr):
        return ''

只有在通过常规方法找不到属性时才调用__getattr__,因此不需要处理查找实际设置的属性。


无需覆盖__setattr____getattr__

1
2
3
4
5
6
7
>>> class VarDump(object):
...     pass
...
>>> c = VarDump()
>>> c.bar = 2
>>> print c.bar
2