在类上覆盖 dict()

Chr*_*roa 6 python dictionary iterator overriding python-3.x

我正在尝试dict在 Python 中创建一个类似的类。

当你创建一个类时,你有一些方法告诉 Python 如何创建一个内置类。例如,__int__如果用户int()在类的实例上使用,覆盖该方法会告诉 Python 返回什么。对于__float__. 您甚至可以通过覆盖该__iter__方法来控制 Python 如何生成类的可迭代对象(这可以帮助 Python生成类的lists 和tuples)。我的问题是你如何告诉 Python 如何制作dict你的自定义类?没有什么特别的__dict__方法,你会怎么做呢?我想要类似以下内容:

class Foo():
    def __dict__(self):
        return {
            'this': 'is',
            'a': 'dict'
        }

foo = Foo()
dict(foo) # would return {'this': 'is', 'a': 'dict'}
Run Code Online (Sandbox Code Playgroud)

我试过让类继承自dict,但由于子类试图继承自dictand type,因此在代码中稍后会引发错误,因此继承自dict是不可能的。有没有其他方法可以做到?

此外,我已经覆盖了该__iter__方法,以便它返回一个dict_keyiterator对象(iter()在 a 上使用时返回的内容dict),但它似乎仍然无法正常工作。

For*_*ntr 6

dict可以使用可迭代的对进行调用,因此如果您设计__iter__返回可迭代的元组,则您的示例将按照您的意愿工作:

class Foo:
    def __iter__(self):
        yield from {
            'this': 'is',
            'a': 'dict'
        }.items()

dict(Foo())
{'a': 'dict', 'this': 'is'}
Run Code Online (Sandbox Code Playgroud)

如果您希望您的类表现得像 python 字典,因为迭代实例会迭代其键,您可以实现abc.Mapping.

您可以通过实现__getitem____iter__、 和并__len__继承、、、、、、、、 和来实现此目的。abc.Mapping__getitem____iter____len__ __contains__keysitemsvaluesget__eq____ne__

  • 这确实可以正确地在“Foo”对象上创建“dict”,但是您无法迭代项目的键。像“for i in Foo()”这样的东西不会迭代对象的_keys_,它会迭代“(key, value)”元组的_tuple_。 (2认同)