大多数内置Python类是否缺少__dict__?原因是什么?

时间:2019-04-12 06:49:55

标签: python python-3.x python-internals

原生Python类(例如, os.stat_result,没有__dict__属性(例如how to avoid class having a __dict__中建议的属性)?

内置类(例如os.stat_result)缺少此功能的技术原因是什么?

1 个答案:

答案 0 :(得分:4)

我不知道对此是否有“正确”的答案-原因是,对于大多数这些对象而言,它们可以快乐地生活而无需在其实例上附加额外的属性-以及拥有{{1 }}根本不值得。

您能尝试假设Python的__dict__是否具有int吗?对于每个数字,除了占用80字节左右的字节外,还会建立另一个200字节的对象,以便使一个对象具有固定为其“ 42”的属性?

此外,对于像元组,字符串之类的不可移植类,同一实例可以在不同的上下文中重用-一个实例中的__dict__可能会使同一对象的看似非连接实例突然变成生成属性。

另外,您提到的__dict__特定类是一个命名元组-它是不变且紧凑的。

因此,除了为大多数对象创建os.stat_result的大小和资源成本外,还存在编码问题:这些通常是本地编码的(即,用C编写)-并且__dict__属性必须显式地创建-因此,与使用Python编码的类不同,必须竭尽所能允许这些类中的__dict__,而对于Python代码而言,绕行是避免使用__dict__。 / p>

最后,当开发该语言的社区得出结论认为,具有__dict__的对象将具有任何明显的优势时,可以将其包括在内。以前,Function对象类型本身就是这种情况-现在,装饰器可以将函数附加到属性上,并且可以很好地利用它。

如果您需要将附加属性附加到单个类的代码,则可以采用老式的方式进行操作,只需继承该类并将对象转换为该类即可。 (我发现__dict__不是 一个named_tuple,并且不能用作基类-对此很抱歉-因此,将其包装在一个简单的类中可能是最简单的要做的事情:

os.stat_result

现在,如果您的目标是提取字段标题/值作为dict,而不是向其添加额外的属性-这些对象的自省部分由class MyStatResult: def __init__(self, stat_result): self.stat = stat_result def __repr__(self): return "Wrapper for" + repr(self.stat) 给出-对于{{1 }}重要的前缀有一个漂亮的前缀:

dir

在Python 3.8中,借助PEP 572,人们可以将其写为一个不错的单行代码:

os.stat_result