gpt4 book ai didi

python - 用 OrderedDict 替换对象的默认 __dict__

转载 作者:太空狗 更新时间:2023-10-30 01:51:03 25 4
gpt4 key购买 nike

我的代码中有两个类。 first 是父级,second 继承。

class first(object):
def __init(self,**kwargs):
pass

def __setattr__(self,name,value):
self.__dict__[name] = value

class second(first):
def do_something(self):
self.a = 1
self.b = 2
self.c = 3

当我打印第二个类时(例如 second.__dict__),我得到了无序字典。这是显而易见的。我想更改此行为以使用 OrderedDict 类获取有序字典,但它不起作用。我正在通过以下方式更改 first 的实现:

class first(OrderedDict):   
def __init__(self,**kwargs):
super(first,self).__init__(**kwargs)
def __setattr__(self,name_value):
super(first,self).__setattr__(name_value)

我想使用 __dict____repr__ 打印 second,但我得到的是无序字典。我应该改变什么?

最佳答案

您可以简单地将所有属性访问重定向到 OrderedDict:

class first(object):
def __init__(self, *args, **kwargs):
self._attrs = OrderedDict(*args, **kwargs)

def __getattr__(self, name):
try:
return self._attrs[name]
except KeyError:
raise AttributeError(name)

def __setattr__(self, name, value):
if name == '_attrs':
return super(first, self).__setattr__(name, value)
self._attrs[name] = value

演示:

>>> from collections import OrderedDict
>>> class first(object):
... def __init__(self, *args, **kwargs):
... self._attrs = OrderedDict(*args, **kwargs)
... def __getattr__(self, name):
... try:
... return self._attrs[name]
... except KeyError:
... raise AttributeError(name)
... def __setattr__(self, name, value):
... if name == '_attrs':
... return super(first, self).__setattr__(name, value)
... self._attrs[name] = value
...
>>> class second(first):
... def do_something(self):
... self.a = 1
... self.b = 2
... self.c = 3
...
>>> s = second()
>>> s.do_something()
>>> s._attrs
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

否则您不能用 OrderedDict 实例替换 __dict__ 属性,因为 Python 通过使用具体类 API 访问 C 中的字典内部来优化实例属性访问,完全绕过 OrderedDict.__setitem__ Hook (参见 issue #1475692)。

关于python - 用 OrderedDict 替换对象的默认 __dict__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27941581/

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