原生Python类(例如, os.stat_result
,没有__dict__
属性(例如how to avoid class having a __dict__中建议的属性)?
内置类(例如os.stat_result
)缺少此功能的技术原因是什么?
答案 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