0

我正在尝试制作一个 VarDump 类,我可以在其中执行以下操作:

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
4

3 回答 3

2

self.dump={}调用__setattr__set dump,调用__getattr__get dumpto put dump,调用__getattr__get thedump等。你可以用 解决这个问题object.__setattr__,但更简单的方法是这样做:

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

__getattr__仅在通过正常方式找不到属性时才调用,因此不需要处理查找已实际设置的属性。

于 2013-07-30T20:01:24.037 回答
2

在 Python 3.3 中,请改用新types.SimpleNamespace()类型

>>> 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')
于 2013-07-30T20:06:40.073 回答
0

无需覆盖__setattr____getattr__

>>> class VarDump(object):
...     pass
... 
>>> c = VarDump()
>>> c.bar = 2
>>> print c.bar
2
于 2013-07-30T20:01:35.277 回答