2017-03-01 6 views
0

Voici un exemple de code qui sous-classe datetime.Pourquoi la sous-classe de datetime n'est-elle pas une instance de sous-classe lors de la spécification de l'argument tz à la méthode fromtimestamp?

Puisque pass est le seul corps de sous-classe, la méthode '__new__' de datetime devrait être conservée.

Le code suivant a été testé sur Python 3.4.2 sur Mac OS 10.12.3 et Python 3.6.0 sur Arch Linux. Dans les deux cas, même résultat. La question est, pourquoi 'a' est une instance de MyDatetime quand 'b' n'est pas une instance de MyDatetime quand ils ne diffèrent que par l'argument tz?

Nous vous remercions de vos commentaires. Maintenant, avec l'exemple ...

#!/usr/bin/env python3 

from datetime import datetime 
from datetime import timezone 

class MyDatetime(datetime): 
    pass 

if __name__ == '__main__': 
    dt = 1231798102 

    a = MyDatetime.fromtimestamp(dt) 
    b = MyDatetime.fromtimestamp(dt, tz=timezone.utc) 

    print('Why is isinstance(a, MyDatetime) == {}, while isinstance(b, MyDatetime) == {}?'.format(isinstance(a, MyDatetime), isinstance(b, MyDatetime))) 

L'exemple ci-dessus imprime les éléments suivants: ? Pourquoi est-isinstance (a, MyDateTime) == Vrai, tandis que isinstance (b, MyDateTime) == False '

Ici type(a) == <class '__main__.MyDatetime'>, tandis que type(b) == <class 'datetime.datetime'>.

Répondre

0

En passant tz dans MyDatetime.fromtimestamp(dt, tz=timezone.utc) qui retourne tz.fromutc in the implementation invoque un nouvel objet datetime ignorant la sous-classe réelle que vous avez créé.

, mais je doute la façon la plus efficace d'assurer votre classe étant traité:

class MyDatetime(datetime): 
    @classmethod 
    def fromtimestamp(cls, t, tz=None): 
     result = super().fromtimestamp(t, tz) 
     if tz: 
      print(result.strftime("%s")) 
      return super().fromtimestamp(int(result.strftime("%s"))) 
     return result 
+0

Oui, je vis aussi bien en regardant le code source. Serait-il possible d'étendre la réponse de sorte que datetime puisse être sous-classé de manière à obtenir un objet datetime conscient, tel que celui documenté sur https://docs.python.org/3/library/datetime.html#datetime.datetime .utcfromtimestamp datetime.fromtimestamp (timestamp, timezone.utc)? Ou pour les principes de stackoverflow devrait-on poser une nouvelle question? – paretech