【问题标题】:Yielding a dictionary containing an object's attributes in Python在 Python 中生成包含对象属性的字典
【发布时间】:2011-07-13 02:59:56
【问题描述】:

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

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

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

谢谢!

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

Python dictionary from an object's fields

这就是我需要知道的几乎所有内容。

【问题讨论】:

  • 澄清一下,在 y“模仿”x 之前,它甚至没有属性名称或编号。我的困境不仅仅是属性值的传递,而是属性本身。

标签: python


【解决方案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()

【讨论】:

  • 这是 OP 可以采取的另一种新颖方法,是的。它也有它的好处。但是复制“模仿”对象的__dict__ 也是如此;例如,如果“模仿”的语义是“模仿”时“模仿”对象的快照。只是一个观察。
  • 是的,快照的想法闪过我的脑海。但我认为如果可能的话,最好只复制对象。
  • 快照实际上是我想要制作的。这是人工智能的一部分。游戏中的系统,其中角色有能力记住他们最后一次见面时的状态。当另一个人离开时,我在一个人的脑海中保存了一个“快照”;第一种方法对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2019-01-13
  • 1970-01-01
  • 2018-01-25
  • 2023-04-02
  • 2014-03-04
  • 2014-03-01
相关资源
最近更新 更多