2017-03-01 4 views
0

以下は、datetimeをサブクラス化するサンプルコードです。メソッドfromtimestampに引数tzを指定すると、datetimeのサブクラスがサブクラスのインスタンスでないのはなぜですか?

passは唯一のサブクラス本体であるため、datetimeのメソッド '__new__'は保持されることが期待されます。

次のコードは、Mac OS 10.12.3のPython 3.4.2とArch LinuxのPython 3.6.0でテストされています。どちらの場合も、同じ結果です。

質問は、 'b'が引数tzだけが異なるときにMyDatetimeのインスタンスではない場合、 'a'はなぜMyDatetimeのインスタンスですか?

フィードバックいただきありがとうございます。今の例で...

#!/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))) 

上記の例は次のように出力します。 '?なぜでisinstance(、MyDatetime)は、== trueの間はFalseでisinstance(B、MyDatetime)=='

ここでtype(a) == <class '__main__.MyDatetime'>であり、type(b) == <class 'datetime.datetime'>である。

答えて

0

tzMyDatetime.fromtimestamp(dt, tz=timezone.utc)にすると、tz.fromutc in the implementationが呼び出され、作成した実際のサブクラスを無視して新しいdatetimeオブジェクトが返されます。

一つが、私はあなたのクラスを考えます保証の最も効果的な方法を疑う:

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

はい、私は、ソースコードを見て、それにも見ました。その答えを拡大することで、datetimeをサブクラス化して、認識可能なdatetimeオブジェクトを取得することができますか?たとえばhttps://docs.python.org/3/library/datetime.html#datetime.datetimeに記載されています。 .utcfromtimestamp datetime.fromtimestamp(timestamp、timezone.utc)?または、新しい問題を提起する必要がありますstackoverflowの原則のために? – paretech

関連する問題