主要观点:在 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) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。