继承自类(datetime.date)会导致super().__ init __(...)参数TypeError太多

时间:2017-08-31 12:09:58

标签: python python-3.x class inheritance super

我正在使用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)

没有遇到任何问题。

1 个答案:

答案 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)