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

1 投票
2 回答
524 浏览
提问于 2025-04-16 13:28

我现在正在尝试写一段代码,目的是把一个类实例的所有属性都放到一个字典里,这样我就可以在不改变原对象的情况下修改这些属性。有没有什么方法可以做到这一点,或者有没有什么内置的字典可以复制和访问呢?

其实我想做的是创建一个特殊的类,它可以复制其他不同类实例的实际属性(以及对应的值)。简单来说,它可以模仿任何类的实例。

举个例子,假设对象 x 有属性 x.name 和 x.number,分别是 "Joe" 和 7。我希望我的新对象 mimic,叫做对象 y,能够复制这些属性,这样 y 就会有属性 y.name 和 y.number,值分别是 "Joe" 和 7。

谢谢!

编辑:我在发帖后不久就找到了我想要的东西!

从对象的字段创建 Python 字典

这基本上就是我需要知道的全部内容。

2 个回答

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'}
>>>
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()

撰写回答