我需要一个扩展datetime.date
的类,以添加与我的应用程序相关的逻辑。它曾经在Python 2上可以很好地工作,但是我不明白如何在Python 3中编写构造函数。我认为在Python 3中编写派生构造函数的标准方法如下:
from datetime import date
class my_date(date):
def __init__(self, year, month, day):
super().__init__(year, month, day)
date(2020, 4, 18)
my_date(2020, 4, 18)
但是,此代码失败并显示:
Traceback (most recent call last):
File "/tmp/test.py", line 8, in <module>
my_date(2020, 4, 18)
File "/tmp/test.py", line 5, in __init__
super().__init__(year, month, day)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
我应该怎么做才能正确地调用超级构造函数?
尤其是datetime.date
明确接受使用三个数字进行初始化。为什么错误消息说需要一个参数?为什么在object.__init__()
中而不是datetime.date.__init__()
中出现问题?
评论的答案:
查看datetime.date的Python源,您会注意到它没有
__init__()
方法,只有__new__()
构造函数。那将解释上述错误。还请注意year
,month
,day
是修饰(即只读)属性,而不是实例值。
用
super().__init__(year, month, day)
替换pass
from datetime import date
class my_date(date):
pass
d1 = date(2020, 4, 18)
d2 = my_date(2020, 4, 18)
print(d1,d2)
输出:
2020-04-18 2020-04-18