修改对象的__dict__以设置其属性是否被视为Pythonic?


12

我有一个从数据库(或其他来源,例如MongoDB,CSV文件等)中找到的行中夸大对象的类。要设置对象的属性,它会执行类似self.__dict__.update(**properties)或的操作obj.__dict__.update(**properties)

这被认为是Pythonic吗?这是我应该继续使用的好模式,还是这种不好的形式?


1
我不知道它是否是Pythonic,但在dunder init中执行它当然更常见。
user16764 2013年

Answers:


10

在Python 3.3中,添加了新类型types.SimpleNamespace(),并在文档中对此进行了描述:

该类型大致等于以下代码:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

注意__init__类型的方法;您不能比Python文档更好地认可该技术。


尽管SimpleNamespace与大多数类型有很大不同,但是它没有一组固定的属性。

7
好了,从docs.python.org/2/library/stdtypes.html说起 Python文档,“每个模块的特殊属性是__dict__。这是包含模块符号表的字典。修改此字典实际上会更改模块的符号表,但__dict__无法直接分配给该属性(您可以编写m.__dict__['a'] = 1,将其定义m.a为1,但不能writem.__dict__ = {})不建议直接进行修改__dict__,”,这是最初提示我提出此问题的原因。
skyler 2013年

@skyler:请注意,这仅提及模块名称空间。该globals()函数返回相同的名称空间,通常比动态设置全局变量(因此发出警告)有更好的方法来解决问题。
马丁·皮特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.