2009-11-13 42 views
2

我可以用這個當我需要具有不同屬性的多個對象:是否有一個可以容納任何用戶屬性的現有Python類?

class struct(object): 
    def __init__(self,*args,**kwargs): 
     for key,val in kwargs.items(): 
     setattr(self,key,val) 

但我想知道,如果沒有一個內置的了嗎?

+2

看來你正在尋找這樣的東西:http://stackoverflow.com/questions/1528932/how-to-create-inline-objects-with-properties-in-python/1528993#1528993 – SilentGhost 2009-11-13 17:42:34

回答

9

除非我不理解你的問題,這不是我們使用的dict?當然,它在概念上略有不同,但對象的屬性仍然存儲在dict(即__dict__)中。這是一個符號的問題。

但是,如果你堅持,那麼這是做到這一點的一種方法:

>>> class struct(dict): 
...  def __getattribute__(self, key): 
...   return self[key] 
... 
>>> s = struct(a=5, b=7) 
>>> s.a 
5 

注意我使用__getattribute__,而不是__getattr__。原因是否則我們不能存儲名稱的屬性,如getkeys,因爲這些是由dict定義的方法。

solution by SilentGhost可能更有效率,並且可以正常工作,而不訴諸於使用__getattribute__。代碼然後變成:

>>> def struct(**kwargs): 
...  return type('Struct', (object,), kwargs) 
... 
>>> s = struct(a=5, b=7) 
>>> s.a 
5 
3

我不確定你爲什麼不用這個字典。

x = {} 
x.update([(1, 2), (3, 4), (5, 6)]) 
print x 

結果

{1: 2, 3: 4, 5: 6} 

x.update(a=2, b=4, c=6) 

結果

{'a': 2, 'c': 6, 'b': 4} 
3

我想知道同樣的事情。我喜歡x.foo而不是x["foo"]的便利;單個句點比輸入[""]更容易打字(並且正確)。

字典的好處是,什麼可以是一個關鍵。 (好吧,任何可排序的。)但是當我想要捆綁在一起的一堆值時,我選擇的鍵名是有效的標識符。

下面是這一理念的基本版本:

class struct(object): 
    pass 

x = struct() 
x.foo = 1 

只要你要這麼多的麻煩,你不妨補充的是,方便的初始化處理kwargs__init__()。但我很懶,我希望有內置的東西。

我想這一點,它不工作:

x = object() 
x.foo = 1 # raises AttributeError exception 

我問它,我得到的答案是,object是Python中所有類型的根;它儘可能小。如果它可以像一個類實例一樣運行,並具有它自己的__dict__屬性,那麼在Python中創建的每個對象都需要附加__dict__

我本來希望看到struct作爲Python 3.x的內置補充。但我明白爲什麼不這樣做:保持語言小而乾淨是一個有價值的目標,而且這個功能很容易自己編寫。

+0

尼斯分析。讓我加兩件事:(1)'object'的這個屬性,它沒有'__dict__',也可以用於其他類,通過定義'__slots__'(參見http://docs.python.org /reference/datamodel.html#slots for more); (2)關於你的最後一段:'import this'指出:*應該有一個 - 最好只有一個 - 明顯的方法來做到這一點。* – Stephan202 2009-11-13 20:18:39

相關問題