主要观点:在 Python 3.7 之前,__init__特殊方法用于构建数据结构类,之后引入dataclass等工具来替代自定义__init__。
关键信息:
- 之前用
__init__构建类时存在多种问题,如暴露函数替代类、用户手动赋值、默认值导致对象可变等。 - 以
FileReader类为例,初始用__init__构建方便,但后续需求变化时会出现问题,如需要处理其他库管理open的情况,测试也更麻烦。 - 提出的解决方案包括使用
dataclass定义属性、用classmethod创建对象、用NewType解决对象有效性问题。
重要细节:
dataclass会得到默认的__init__方法,但可能会带来一些问题,如减少FileReader("path")的便利性和无法强制_fd为有效文件描述符。@classmethod可解决创建对象的便利性问题,且不受__init__特殊方法的约束。NewType可更精确地定义对象,强制对原始数据类型的约束,如将int替换为FileDescriptor。- 总结新的最佳实践为使用
dataclass、默认__init__、classmethod创建对象、用NewType约束原始数据类型等。 - 感谢赞助者并提及可咨询相关工作。
- 解释了文件描述符的概念。提及
attrs class可选,一般不建议在__init__中进行 I/O 操作,可通过__post_init__处理特殊情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。