2011-03-10 43 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

相关问题