以下似乎以任何一种方式起作用。使用repr有什么好处(除了漂亮的types.SimpleNamespace之外)?还是同一件事?

>>> import types
>>> class Cls():
...     pass
...
>>> foo = types.SimpleNamespace() # or foo = Cls()
>>> foo.bar = 42
>>> foo.bar
42
>>> del foo.bar
>>> foo.bar
AttributeError: 'types.SimpleNamespace' object has no attribute 'bar'

最佳答案

types模块描述中对此进行了很好的解释。它向您显示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))

    def __eq__(self, other):
        return self.__dict__ == other.__dict__

与空类相比,这具有以下优点:
  • 允许您在构造对象时初始化属性:sn = SimpleNamespace(a=1, b=2)
  • 提供可读的repr():eval(repr(sn)) == sn
  • 它覆盖默认比较。而不是通过id()进行比较,它而是比较属性值。
  • 关于python - SimpleNamespace和空类定义有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37161275/

    10-09 08:03