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

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

あなたのバージョンとこのバージョンの唯一の違いは、これが and を使用しないことです (まったく必要ありません__setattr__) __getattr__。このバージョンは初期化子で初期値を取り、適切な表現が含まれています。

>>> vd
namespace(foo='bar')
于 2013-07-30T20:06:40.073 に答える