我建议您使用第一个版本,在第一个版本中,您可以在大多数情况下为__init__方法的参数分配类型。在
该特定方法具有最少的冗余量,同时仍然允许类型检查程序验证您是否在代码的其他地方正确地调用了__init__方法。在
我建议您使用第二个或第三个版本,当您的__init__方法变得足够复杂到可以应用以下一个或多个时,可以显式地对字段进行注释(在__init__内部或外部):你的领域从什么开始就不再那么简单了
参数和字段之间不再是一对一的映射
你有复杂的初始化逻辑,模糊了如何分配字段。在
然而,我不清楚是第二个版本还是第三个版本我个人更喜欢第三个版本,因为它在概念上更清晰,似乎没有混合实例和类属性的概念,但我不能否认第二个版本看起来更干净。在
我在“typing”gitter频道上问到了这个问题,得到了来自Guido的以下回应(也许你不知道,Guido开发了Python,目前正在研究mypy和与键入相关的东西):There seem to be strong opinions either way. I do indeed prefer putting attribute annotations in the class body rather than sprinkling them throughout __init__ and other methods. I also think that with PEP 526 this will be the future (also with things like class-based NamedTuple declarations and possibly https://github.com/ericvsmith/dataclasses).
因此,第二个版本似乎比第三个版本更受推荐,并且以这种方式定义类在将来的某个时候将更深入地集成到Python语言本身中!在
{a3>似乎在{/strong}上将包含在Python3.7中。在