在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)