我可以用這個當我需要具有不同屬性的多個對象:是否有一個可以容納任何用戶屬性的現有Python類?
class struct(object):
def __init__(self,*args,**kwargs):
for key,val in kwargs.items():
setattr(self,key,val)
但我想知道,如果沒有一個內置的了嗎?
我可以用這個當我需要具有不同屬性的多個對象:是否有一個可以容納任何用戶屬性的現有Python類?
class struct(object):
def __init__(self,*args,**kwargs):
for key,val in kwargs.items():
setattr(self,key,val)
但我想知道,如果沒有一個內置的了嗎?
除非我不理解你的問題,這不是我們使用的dict
?當然,它在概念上略有不同,但對象的屬性仍然存儲在dict
(即__dict__
)中。這是一個符號的問題。
但是,如果你堅持,那麼這是做到這一點的一種方法:
>>> class struct(dict):
... def __getattribute__(self, key):
... return self[key]
...
>>> s = struct(a=5, b=7)
>>> s.a
5
注意我使用__getattribute__
,而不是__getattr__
。原因是否則我們不能存儲名稱的屬性,如get
和keys
,因爲這些是由dict
定義的方法。
solution by SilentGhost可能更有效率,並且可以正常工作,而不訴諸於使用__getattribute__
。代碼然後變成:
>>> def struct(**kwargs):
... return type('Struct', (object,), kwargs)
...
>>> s = struct(a=5, b=7)
>>> s.a
5
我不確定你爲什麼不用這個字典。
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}
我想知道同樣的事情。我喜歡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的內置補充。但我明白爲什麼不這樣做:保持語言小而乾淨是一個有價值的目標,而且這個功能很容易自己編寫。
尼斯分析。讓我加兩件事:(1)'object'的這個屬性,它沒有'__dict__',也可以用於其他類,通過定義'__slots__'(參見http://docs.python.org /reference/datamodel.html#slots for more); (2)關於你的最後一段:'import this'指出:*應該有一個 - 最好只有一個 - 明顯的方法來做到這一點。* – Stephan202 2009-11-13 20:18:39
看來你正在尋找這樣的東西:http://stackoverflow.com/questions/1528932/how-to-create-inline-objects-with-properties-in-python/1528993#1528993 – SilentGhost 2009-11-13 17:42:34