我正在使用Python 3.6,并希望编写一个扩展datatime.date
的类,并在我的代码中引入了一些我需要的其他属性和方法。
问题是由于看似过多的参数,初始化似乎无法正常工作。
以下是最低限度的代码:
FORMAT__DD_MM_YYYY = "dd.mm.yyyy"
from datetime import date
class DateExtended(date):
date_string = None
date_format = None
def __init__(self, year: int, month: int, day: int, date_format: str=None):
super().__init__(year=year, month=month, day=day)
self.date_format = date_format
self.date_string = "{:02d}.{:02d}.{:04d}".format(self.day, self.month, self.year)
bla1 = DateExtended(year=2010, month=5, day=3, date_format=FORMAT__DD_MM_YYYY_DOT)
执行它会导致以下错误:
bla1 = DateExtended(year=2010, month=5, day=3, date_format=FORMAT__DD_MM_YYYY_DOT)
TypeError: function takes at most 3 arguments (4 given)
我在这里做错了什么,应该如何解决?
是因为date
没有延伸object
吗?
旁注:当我自己尝试修复此问题时,我还编写了一个不继承自date
的类,但只创建了一个date
对象并将其存储为其属性之一:
self.date = date(year=year, month=month, day=day)
没有遇到任何问题。
答案 0 :(得分:4)
这是因为datetime.date
在__new__
中进行初始化,而不在__init__
中进行初始化,而错误来自datetime.date.__new__
只接受3个参数的事实,而不是4。
所以你必须覆盖__new__
:
FORMAT__DD_MM_YYYY = "dd.mm.yyyy"
from datetime import date
class DateExtended(date):
date_string = None
date_format = None
def __new__(cls, year: int, month: int, day: int, date_format: str=None):
# because __new__ creates the instance you need to pass the arguments
# to the superclass here and **not** in the __init__
return super().__new__(cls, year=year, month=month, day=day)
def __init__(self, year: int, month: int, day: int, date_format: str=None):
# datetime.date.__init__ is just object.__init__ so it takes no arguments.
super().__init__()
self.date_format = date_format
self.date_string = "{:02d}.{:02d}.{:04d}".format(self.day, self.month, self.year)
bla1 = DateExtended(year=2010, month=5, day=3, date_format=FORMAT__DD_MM_YYYY)