在Python中生成包含对象属性的字典

时间:2011-03-10 23:03:55

标签: python

我目前正在尝试编写一段代码,将给定类实例的所有属性转储到字典中,以便我可以在不更改源对象的情况下更改它们。有没有这样做的方法,或者我可以复制和访问的内置字典?

我真正在做的是创建一个特殊的类,它从不同的其他类的实例中复制实际的属性(及其相应的值)。基本上它会模仿任何类的任何实例。

例如,对象x分别具有x.name和x.number,“Joe”和7的属性。我希望我的新对象模仿,对象y,复制属性,使y现在具有属性y.name和y.number,“Joe”和7。

谢谢!

编辑: 发布此内容后,我发现了我想要的内容!

Python dictionary from an object's fields

这几乎是我需要知道的全部内容。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

Very object有一个__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'}
>>>