停止编写 `__init__` 方法

主要观点:在 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__处理特殊情况。
阅读 27
0 条评论