gpt4 book ai didi

python - OrderedDict 不会在类中排序

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:43 39 4
gpt4 key购买 nike

我有一个父类,我想保留其子类的所有实例的注册表(以字典的形式)。很简单,但我希望注册表根据其键对自身进行排序,这些键是初始化时 2 个子类的参数。这是我的简化形式的代码:

from collections import OrderedDict

class Parent:
_registry = OrderedDict()
def __init__(self):
# add each sub-class instance to the registry & sort the registry
self._registry.update({self._num:self})
self._registry = OrderedDict(sorted(self._registry.items()))

class Foo(Parent):
def __init__(self, number):
self._num = number
Parent.__init__(self)
# then do some stuff

class Bar(Parent):
def __init__(self, number):
self._num = number
Parent.__init__(self)
# then do some other stuff
...

但是,尽管注册表会使用新的子类对象进行 self 更新,但它不会自行排序。

>>> a = Foo(3)
>>> Parent._registry # check to see if a was added to the registry
OrderedDict([(3, <Foo instance at 0x00A19C0C8>)])
>>> b = Bar(1)
>>> Parent._registry # check to see if b was inserted before a in the registry
OrderedDict([(3, <Foo instance at 0x00A19C0C8>), (1, <Bar instance at 0x00A19C1C8>)])

b 在注册表中位于 a 之后!

如果我在 iPython 控制台中手动执行,它会起作用:

>>> Parent._registry = OrderedDict(sorted(Parent._registry.items()))
OrderedDict([(1, <Bar instance at 0x00A19C1C8>), (3, <Foo instance at 0x00A19C0C8>)])

为什么它不会自行排序?我需要它,因为稍后,必须按照它们的 number 参数的严格顺序对这些对象进行操作。

最佳答案

那是因为:

self._registry = OrderedDict(sorted(self._registry.items()))

在实例上创建一个新属性,这不会影响 Parent._registry

将该行替换为:

Parent._registry = OrderedDict(sorted(self._registry.items()))

这里self._registry.items()可以获取Parent._registry的值,但这并不意味着赋值给self._registry 将影响 Parent._registry


另一种使用 self._registry 本身的方法:

def __init__(self):
items = sorted(self._registry.items() + [(self._num, self)]) #collect items
self._registry.clear() #clean the dict
self._registry.update(items) #now update it

关于python - OrderedDict 不会在类中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724650/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com