Python 如何进行从对象到dict的自定义转换?

Python 如何进行从对象到dict的自定义转换?,python,Python,我有一个Python类,它存储一些字段和一些属性,比如 class A(object): def __init__(self, x, y): self.x = x self.y = y @property def z(self): return self.x+1 我需要对班级做什么样的改变才能做到这一点 >>> a = A(1,5) >>> dict(a) {'y':5, 'z':2} 其中我指定要返回y和z?我不能只

我有一个Python类,它存储一些字段和一些属性,比如

class A(object):
  def __init__(self, x, y):
    self.x = x
    self.y = y

  @property
  def z(self):
    return self.x+1
我需要对班级做什么样的改变才能做到这一点

>>> a = A(1,5)
>>> dict(a)
{'y':5, 'z':2}

其中我指定要返回
y
z
?我不能只使用
a.\uu dict\uuu
,因为它将包含
x
,而不是
z
。我希望能够指定任何可以使用
\uuuu getattribute\uuu
访问的内容。我认为解决此问题的合理方法是创建一个
asdict
方法。当您说要指定希望dict包含哪些键时,我假设您对调用该方法时传递的信息感到满意。如果你不是这个意思,告诉我。(这包含了作者的优秀建议。)

测试:

>>> A(1, 2).asdict('x', 'y')
{'y': 2, 'x': 1}
>>> A(1, 2).asdict()
{'y': 2, 'z': 2}

解决这个问题的简单方法如下。这可能不足以满足你的需要,但我只是指出,以防你错过它

>>> dict(y=a.y, z=a.z)
>>> {'y': 5, 'z': 2}
向类中添加一个
\uuuuuuuuuu iter\uuuuu()
方法,该方法以键值对的形式返回对象项的迭代器。然后,您可以将对象实例直接传递给
dict()
构造函数,因为它接受一系列键值对

def __iter__(self):
    for key in "y", "z":
        yield key, getattr(self, key)
如果您希望这更灵活一点,并允许在子类上轻松覆盖属性列表(或以编程方式),则可以将键列表存储为类的属性:

_dictkeys = "y", "z"

def __iter__(self):
    for key in self._dictkeys:
        yield key, getattr(self, key)
如果希望词典包含所有属性(包括从父类继承的属性),请尝试:


这就排除了以“uu”开头的成员和可调用对象(例如类和函数)。

你能不能不重写它是一个问题。uuuu dict_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。不过,您可能希望有一个默认列表。这与我已有的列表非常相似,但我特别感兴趣的是使用
dict
内置的。为容器提供默认值的便捷快捷方式:
keys=keys或['y',z']
太好了,第二个代码块正是我要找的。
_dictkeys = "y", "z"

def __iter__(self):
    for key in self._dictkeys:
        yield key, getattr(self, key)
def __iter__(self):
    for key in dir(self):
        if not key.startswith("_"):
            value = getattr(self, key)
            if not callable(value):
                yield key, value