2017-08-31 68 views
2

我正在使用Python 3.6並希望編寫一個擴展datatime.date的類,並引入了一些額外的屬性和方法,我需要在我的代碼中。 問題是由於看起來太多的參數,初始化似乎不能正常工作。繼承自類(datetime.date)會導致super().__ init __(...)太多參數TypeError

下面是代碼減少到最低限度:

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

是的,問題是'日期'是一種方法,而不是一個類。你只能用另一個類而不是方法來擴展一個類。 – campovski

+3

@campovski:'type(date)'是''。看起來像一個類對我來說 – Billy

+0

@比利感謝您提出這個,但你不明白'type()'的輸出。 'date'的類型是'type'。嘗試'輸入(2)',你會得到''。 – campovski

回答

2

這是因爲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)