Python中调用抽象类tzinfo未定义的__new__方法会发生什么?
Python 3.9中tzinfo抽象类相关问题解答
问题1:tzinfo作为抽象类无法实例化,是否因此未定义__new__方法?
不是。抽象基类(ABC)不能被实例化,核心原因是它包含未实现的抽象方法(比如tzinfo要求子类必须实现utcoffset()、dst()、tzname()),和有没有定义__new__方法没有直接关联。
tzinfo没有自定义__new__,是因为它的设计定位是作为基类,让子类(比如自带的timezone类)去实现具体的实例化和时区逻辑,不需要自身提供实例创建的逻辑。实际上它会继承object类的__new__方法,只不过因为抽象方法的存在,直接尝试实例化tzinfo会触发TypeError,提示无法实例化抽象类。
问题2:调用tzinfo.__new__会产生什么结果?
由于tzinfo没有自己的__new__实现,调用tzinfo.__new__本质上是调用它从object继承来的__new__方法:
- 如果直接调用
tzinfo.__new__(tzinfo),虽然能生成一个tzinfo的实例对象,但这个实例没有实现要求的抽象方法,后续任何依赖这些抽象方法的操作(比如和datetime对象结合使用)都会抛出NotImplementedError。 - 在
timezone类的_create方法里,实际调用的是tzinfo.__new__(timezone, ...)(第一个参数是子类timezone),这时object.__new__会创建一个timezone类的实例,再由timezone的初始化逻辑完成时区参数的设置,最终得到合法的timezone实例(比如我们常用的timezone.utc)。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

