2011-03-10 42 views
1

我目前正在嘗試編寫一段代碼,將給定類實例的所有屬性轉儲到字典中,以便我可以在不更改源對象的情況下更改它們。有沒有這樣做的方法,或者我可以複製和訪問的內置字典?在Python中產生包含對象屬性的字典

我真正在做的是製作一個特殊的類,它從不同的其他類的實例中複製實際屬性(及其相應的值)。基本上它會模仿任何類別的任何實例。

例如,對象x分別具有屬性x.name和x.number,「Joe」和7。我希望我的新對象模仿對象y複製屬性,使y現在具有屬性y.name和y.number,「Joe」和7.

謝謝!

編輯:我發現我張貼後不久就在尋找這個!

Python dictionary from an object's fields

這幾乎是所有我需要知道。

+0

爲了澄清,之前Y「模仿」 X,它甚至不具有的屬性名稱或號碼。我的困境不僅僅是屬性值的轉移,而是屬性本身。 – 2011-03-10 23:06:05

+0

[Python對象字段中的字典]的可能重複(http://stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields) – 2011-11-05 02:11:15

回答

1

非常對象具有__dict__屬性,該屬性將名稱(變量)映射到它們綁定的值。隨便找個地方。

>>> class MyObj(object): 
...  def __init__(self, x, y): 
...    self.x = x 
...    self.y = y 
... 
>>> foo = MyObj('Joe', 7) 
>>> foo.x 
'Joe' 
>>> foo.y 
7 
>>> foo.__dict__ 
{'y': 7, 'x': 'Joe'} 
>>> class Mimic(object): 
...  def __init__(self, obj): 
...    self.__dict__.update(obj.__dict__) 
... 
>>> m = Mimic(foo) 
>>> m.x 
'Joe' 
>>> m.y 
7 
>>> print m.__dict__ 
{'y': 7, 'x': 'Joe'} 
>>> 
+0

謝謝!會做;剛剛在幾秒前發現了類似的答案。 – 2011-03-10 23:10:21

2

爲什麼不是你的「模仿」對象上寫一個__getattr__()(或__getattribute__())方法執行此要求的屬性,只有當,而不是複製的屬性?除了其他好處之外,這會將屬性保留爲可執行代碼(而不是複製它們的返回值),並且即使在創建模擬對象後將新屬性添加到模仿對象中也可以工作。 (另外,我把它叫做一個包裝或代理對象,而不是模仿。)喜歡的東西:

class Wrapper(object): 
    def __init__(self, obj): 
     self.__wrapped__ = obj 
    def __getattr__(self, key): 
     return getattr(self.__wrapped__, key) 

l = [3, 2, 1] 
w = Wrapper(l) 
print w.index(2) # calls through to l.index() 
+0

這是OP可以採取的另一種新穎方法,是的。它也有它的好處。但是複製「模仿」對象的'__dict__'也是如此。例如,如果「Mimic」的語義是「模仿」時的「模仿」對象的快照。只是一個觀察。 – Santa 2011-03-11 01:38:22

+0

是的,快照的想法跨越了我的腦海。但是我認爲如果可能的話,在這種情況下複製對象會更好。 – kindall 2011-03-11 01:42:44

+1

快照實際上是我期望做的。這是A.I.的一部分。系統在遊戲中角色有能力記住他人上次見面時的狀態。當另一個人離開時,我將一個「快照」保存在一個人的頭腦中;第一種方法一直在爲我工作出色。 – 2011-03-12 18:23:02

相關問題