在Python类中重写__dict__()
我有一个类,我想把这个类的对象变成字典,所以我在 __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()
就会识别这些并把键和值复制到一个新的字典对象中。这虽然需要多一点工作,但如果你希望你的自定义类在其他地方也能像映射一样使用,这样做是值得的。