在python类上重载__dict __()

发布于 2021-01-29 17:17:35

我有一个要在其中将对象作为字典返回的类,因此我在中实现了这一点__dict__()。这个对吗?

我确定一旦这样做,便可以使用dict(自定义对象),然后将该对象作为字典取回,但这是行不通的。

你应该超负荷__dict__()吗?您如何做到这一点,以便使用可以将自定义对象转换为字典dict()

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    您可以通过实现一个__iter__方法来提供iterable,该方法应返回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抽象类,并dict()识别二者之一并将键和值复制到新的字典对象中。这还需要更多的工作,但是如果您希望自定义类也像其他地方的映射一样工作,那么这可能是值得的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看