2017-08-31 6 views
2

J'utilise Python 3.6 et je voulais écrire une classe qui étend datatime.date et introduit quelques attributs et méthodes supplémentaires J'ai besoin de mon code. Le problème est que l'initialisation ne semble pas fonctionner correctement en raison de trop nombreux arguments.Hériter d'une classe (datetime.date) provoque un super() .__ init __ (...) trop d'arguments TypeError

Voici le code abattu au minimum:

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) 

exécution provoque l'erreur suivante:

bla1 = DateExtended(year=2010, month=5, day=3, date_format=FORMAT__DD_MM_YYYY_DOT) 
TypeError: function takes at most 3 arguments (4 given) 

Qu'est-ce que je fais mal ici et comment devrait-il être fixé?

Est-ce parce que le date ne s'étend pas object?


Side note: Lorsque vous essayez de réparer moi-même, je l'ai aussi écrit une autre classe qui ne hérite pas de date mais juste crée un objet date et stocke comme l'un de ses attributs:

self.date = date(year=year, month=month, day=day) 

Aucun problème n'est rencontré.

+0

Oui, le problème est que 'date' est une méthode, pas une classe. Vous ne pouvez étendre une classe qu'avec une autre classe, et non une méthode. – campovski

+3

@campovski: 'type (date)' est 'type '. On dirait une classe pour moi – Billy

+0

@Billy merci d'avoir soulevé cela mais vous ne comprenez pas la sortie de 'type()'. 'date' est de type' type'. Essayez 'type (2)' et vous obtenez ''. – campovski

Répondre

2

C'est parce que datetime.date-ce que l'initialisation __new__, pas __init__ et l'erreur provient du fait que datetime.date.__new__ ne prend 3 arguments, non 4.

Vous devez passer outre __new__ ainsi:

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)