在python类上重载

在python类上重载,python,class,Python,Class,我有一个类,希望将对象作为字典返回,因此我在\uuu dict\uuuu()中实现了这一点。这是正确的吗 我想一旦我这样做了,我就可以使用dict(自定义对象),并将该对象作为字典返回,但这不起作用 您是否应该过载\uuuu dict\uuuuu()?如何使用dict()将自定义对象转换为字典?\uuuu dict\uuu不是Python对象上的特殊方法。用于属性字典dict()从不使用它 相反,您可以支持迭代;当传递生成键值对的dict()时,将生成具有这些键值对的新字典对象 您可以通过实现\

我有一个类,希望将对象作为字典返回,因此我在
\uuu dict\uuuu()
中实现了这一点。这是正确的吗

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

您是否应该过载
\uuuu dict\uuuuu()
?如何使用
dict()
将自定义对象转换为字典?

\uuuu dict\uuu
不是Python对象上的特殊方法。用于属性字典
dict()
从不使用它

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

您可以通过实现
\uuuuu iter\uuuu
方法来提供一个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))
演示:


您还可以子类化
dict
,或者实现,并且
dict()
将识别其中一个并将键和值复制到新的dictionary对象。这需要做更多的工作,但如果您希望自定义类在其他地方也像映射一样工作,那么这可能是值得的。

否。
\uuuuuu dict\uuuu
是一种用于内省的方法,它返回对象属性。您需要的是一种全新的方法,例如,将其命名为
,这是惯例。这里需要理解的是,
dict
对象不需要使用
dict
构造函数创建。

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

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

似乎是合乎逻辑的,所以如果你想为iter传回一组选定的信息,你能用一个返回{“var1”:“val1”,…“varn”:“valn”}而不是yield吗?@josh1234:No,
\iter\uuuuuuuu
必须返回一个迭代器;字典本身不是迭代器。@josh1234:您需要生成一系列键值对。所以
iter(somedictionary.items())
很好,但不是直接
somedictionary
。@josh1234:其他的选择是子类
dict
,或者以其他方式实现。我更喜欢这个答案,而不是投票最多的答案。很高兴知道dict是如何工作的,但是重写dict从对象中获取dict对我来说有点不方便。它也可能有一些意想不到的后果。我不会把
\uuuu dict\uuuu
称为内省的方法。它是类的描述符,它的使用远远超出了内省;e、 例如,当您重写
\uuu setattr\uuuu
时,允许您直接写入代码中实例的属性名称空间。这个答案对我来说是最清楚的。在我的例子中,我提供了一个键列表,而不是依赖于
self
def __iter__(self):
    for key in self.__dict__:
        yield key, getattr(self, key)