在Python中生成包含对象属性的字典
我现在正在尝试写一段代码,目的是把一个类实例的所有属性都放到一个字典里,这样我就可以在不改变原对象的情况下修改这些属性。有没有什么方法可以做到这一点,或者有没有什么内置的字典可以复制和访问呢?
其实我想做的是创建一个特殊的类,它可以复制其他不同类实例的实际属性(以及对应的值)。简单来说,它可以模仿任何类的实例。
举个例子,假设对象 x 有属性 x.name 和 x.number,分别是 "Joe" 和 7。我希望我的新对象 mimic,叫做对象 y,能够复制这些属性,这样 y 就会有属性 y.name 和 y.number,值分别是 "Joe" 和 7。
谢谢!
编辑:我在发帖后不久就找到了我想要的东西!
这基本上就是我需要知道的全部内容。
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()