在Python类中重写__dict__()

51 投票
3 回答
59226 浏览
提问于 2025-04-18 03:58

我有一个类,我想把这个类的对象变成字典,所以我在 __dict__() 里实现了这个功能。这这样做对吗?

我想一旦这样做了,我就可以用 dict(自定义对象),把对象变成字典,但这并没有成功。

你应该重写 __dict__() 吗?怎么才能让一个自定义对象可以用 dict() 转换成字典呢?

3 个回答

7

下面这个方法可以让这个类的对象转换成一个 dict(字典):

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

不,__dict__ 是一种用来查看对象内部信息的方法,它会返回对象的属性。你想要的是一个全新的方法,比如叫它 as_dict,这是一种常见的命名方式。这里要明白的是,dict 对象不一定非得用 dict 这个构造函数来创建。

50

__dict__ 其实并不是 Python 对象的一个特殊方法。它是用来存储属性的字典,而 dict() 并不会用到它。

相反,你可以支持 迭代;当 dict() 接收到一个可以生成键值对的 可迭代对象 时,它会生成一个包含这些键值对的新字典对象。

你可以通过实现一个 __iter__ 方法来提供一个可迭代对象,这个方法应该返回一个 迭代器。如果把这个方法实现成一个生成器函数就可以了:

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 类,或者实现 映射抽象类,这样 dict() 就会识别这些并把键和值复制到一个新的字典对象中。这虽然需要多一点工作,但如果你希望你的自定义类在其他地方也能像映射一样使用,这样做是值得的。

撰写回答