出于兴趣,我决定和班一起玩,发现了这么有趣的事情。假设我想创建一个datetime.datetime具有一个附加属性的类:
import datetime
class Foo(datetime.datetime):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # Вызываем конструктор родителя
self.foo = 5 # Добавляем свой атрибут
尝试使用参数实例化类时:
f = Foo(2020, 1, 1)
我收到一个错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-6b5ccf5358aa> in <module>
----> 1 f = Foo(2020, 1, 1)
<ipython-input-1-31281291039f> in __init__(self, *args, **kwargs)
4 class Foo(datetime.datetime):
5 def __init__(self, *args, **kwargs):
----> 6 super().__init__(*args, **kwargs) # Вызываем конструктор родителя
7 self.foo = 5 # Добавляем свой атрибут
8
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
是什么导致了错误,我该如何实现我想要的?
复制粘贴的完整代码:
import datetime
class Foo(datetime.datetime):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # Вызываем конструктор родителя
self.foo = 5 # Добавляем свой атрибут
f = Foo(2020, 1, 1)
该库
datetime使用一种有些不寻常的方法来构造对象(有时可以在标准库模块中找到)。也就是说,对象属性的初始化发生在方法__new__中,__init__但反过来它没有被覆盖(定义在中object),因此不需要它的调用。在您的情况下,在继承树上显式调用
__init__父方法会导致调用object.__init__().不调用父级的构造函数: