“容器”类不是pythonic吗?

2024-05-18 23:28:56 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我想使用一个类似于dictionary的可变对象在进程之间传递数据,但是我没有使用内置dictionary类型,而是创建了一个空的“Container”类,如下所示:

class Container(object):
  pass

x = Container()
x.a = 42
x.b = ['Hitch', 'Hiker']

现在,我可以使用x.a而不是写出x['a'],这对我来说更清楚一些。假设我不希望在键值上循环,那么使用这个“容器”和标准字典有什么主要的缺点吗?你知道吗


Tags: 对象类型标准dictionaryobject进程containerpass
3条回答

如果您想做到这一点并且仍然获得字典的优势,我将子类dict

class Container(dict):
    def __getattr__(self, name):
        return self[name]
    def __setattr__(self, name, value):
        self[name] = value


x = Container()

x.a = 42
x.b = ['Hitch', 'Hiker']

print(x)

印刷品:

{'b': ['Hitch', 'Hiker'], 'a': 42}

您可能希望单独处理现有属性,以便仍然可以更改它们:

def __setattr__(self, name, value):
    if name not in dir(self):
        self[name] = value
    else:
        super().__setattr__(name, value)

是的,这是一个完美的Python的事情做。实际上是recommended in the Python tutorial。你知道吗

我不认为这样做对快速,简单的容器有什么错。主要的缺点是您没有获得dict的所有其他方法(如.get().items(),等等),并且您的键必须是有效的Python标识符。你知道吗

请注意,还有一些库提供了类似的功能和更方便的特性(如attrdict)。你知道吗

相关问题 更多 >

    热门问题