5 votes

Classe Python avec datetime.now() à l'instanciation

Je veux un attribut de classe qui définit datetime.now() lorsqu'une nouvelle instance de la classe est instanciée. Avec ce code, MyThing.created semble toujours être quand MyThing est importé, contrairement à ce qui se passe lorsque mt est instancié.

from datetime import datetime

class MyThing:
    __init__(self, created=datetime.now()):
        self.created = created

MyThing.created
datetime.datetime(2012, 7, 5, 10, 54, 24, 865791)

mt = MyThing()
mt.created
datetime.datetime(2012, 7, 5, 10, 54, 24, 865791)

Comment puis-je faire pour que created c'est quand mt est instancié, par opposition à MyThing ?

11voto

Ned Batchelder Points 128913

Les valeurs par défaut des paramètres de la fonction sont calculées une fois, lorsque la fonction est définie. Elles ne sont pas réévaluées lorsque la fonction est appelée. Typiquement, vous utiliserez None comme valeur par défaut, et le tester dans le corps :

def __init__(self, created=None):
    self.created = created or datetime.now()

Mieux encore, il semble que vous ne souhaitiez jamais passer une date de création dans le constructeur :

def __init__(self):
    self.created = datetime.now()

4voto

jamylak Points 38094

Ne le placez pas dans les paramètres car ils sont membres de la fonction elle-même puisque tout est un objet de première classe.

class MyThing:
    __init__(self, created=None):
        self.created = created
        if created is None:
            self.created = datetime.now()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X