在python类上重载__dict __()

cod*_*000 25 python class

我有一个类,我希望将对象作为字典返回,所以我实现了这个__dict__().它是否正确?

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

你应该超负荷__dict__()吗?你怎么能这样做,所以自定义对象可以转换为字典使用dict()

let*_*bee 32

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

  • 对于投票最多的人,我更喜欢这个答案.很高兴知道`dict`是如何工作的,但是超越`__iter__`从一个物体获得一个dict对我来说看起来有些笨拙.它也可能有一些意想不到的后果. (7认同)

Mar*_*ers 29

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

相反,你可以支持迭代 ; 当dict()传递一个产生键值对的迭代时,会产生一个具有这些键值对的新字典对象.

您可以通过实现一个__iter__方法来提供一个iterable,该方法应该返回一个迭代器.将该方法实现为生成器函数就足够了:

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))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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'}
Run Code Online (Sandbox Code Playgroud)

您还可以子类化dict或实现Mapping抽象类,并且dict()可以识别并将键和值复制到新的字典对象.这是一个更多的工作,但如果你希望你的自定义类在其他地方的行为像一个映射,可能是值得的.


meh*_*met 7

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

def __iter__(self):
    for key in self.__dict__:
        yield key, getattr(self, key)
Run Code Online (Sandbox Code Playgroud)