2013-07-30 53 views
0

我試圖做一個VarDump類,在那裏我可以這樣做:的Python:類如VAR轉儲錯誤

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

其實,如果是這樣的所有你需要的,'class VarDump(object):pass'就足夠了。 – Kimvais

回答

2

self.dump={}電話__setattr__設置dump,這就要求__getattr__得到dumpdump成,這就要求__getattr__得到dump,等等。你可以用object.__setattr__解決這個問題,但更簡單的方法是隻做到這一點:

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

__getattr__僅在通過常規方式找不到屬性時調用,所以這不需要處理查找實際設置的屬性。

+0

+1,打我吧:) – Kimvais

0

無需重寫__setattr____getattr__

>>> class VarDump(object): 
...  pass 
... 
>>> c = VarDump() 
>>> c.bar = 2 
>>> print c.bar 
2 
+0

問題是我不希望他們被寫入自我.__ dict__ –

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

唯一的區別b切口白內障手術挽你的版本,這一個是這一個不使用__setattr____getattr__(沒有必要的),這個版本需要在初始化的初始值,它包括一個不錯的表示:

>>> vd 
namespace(foo='bar') 
+0

好,但是我使用Python 2.7 –

+1

@NacibNeme:這就是爲什麼我包括向後兼容Python版本就在這裏的答案。它直接在Python 2.7上工作。 –