在python类上重载__dict __()

时间:2014-04-23 18:26:06

标签: python class

我有一个类,我希望将对象作为字典返回,所以我在__dict__()中实现了这个。这是对的吗?

我想,一旦我这样做,我就可以使用dict(自定义对象),并将对象作为字典返回,但这不起作用。

你应该重载__dict__()吗?如何使用dict()

将自定义对象转换为字典

3 个答案:

答案 0 :(得分:30)

没有。 __dict__是用于内省的方法 - 它返回对象属性。你想要的是一种全新的方法,例如称之为as_dict - 这就是惯例。这里要理解的是,dict个对象不一定需要使用dict构造函数创建。

答案 1 :(得分:29)

__dict__ 不是 Python对象的特殊方法。它用于属性字典; dict()从不使用它。

相反,您可以支持迭代;当dict()传递一个产生键值对的iterable时,会产生一个带有这些键值对的新词典对象。

您可以通过实施__iter__方法提供可迭代的方法,该方法应返回iterator。将该方法实现为生成器函数就足够了:

class Foo(object):
    def __init__(self, *values):
        self.some_sequence = values

    def __iter__(self):
        for key in self.some_sequence:
            yield (key, 'Value for {}'.format(key))

演示:

>>> class Foo(object):
...     def __init__(self, *values):
...         self.some_sequence = values
...     def __iter__(self):
...         for key in self.some_sequence:
...             yield (key, 'Value for {}'.format(key))
... 
>>> f = Foo('bar', 'baz', 'eggs', 'ham')
>>> dict(f)
{'baz': 'Value for baz', 'eggs': 'Value for eggs', 'bar': 'Value for bar', 'ham': 'Value for ham'}

您也可以继承dict,或实现Mapping abstract classdict()会识别并将键和值复制到新的字典对象。这是一项更多的工作,但如果您希望自定义类在其他任何地方都像映射一样,则可能是值得的。

答案 2 :(得分:1)

以下方法将允许将该类的对象强制转换为dict

def __iter__(self):
    for key in self.__dict__:
        yield key, getattr(self, key)