2

私の Python 2.7.3 プロジェクトには、custom_dateというプロパティを持つ というクラスがありfixed_dateます。

from datetime import date
class custom_date():
    def __init__(self, fixed_date):
        self.fixed_date = fixed_date

    def __lt__(self, other):
        return self.fixed_date < other

    #__gt__, __ge__, __le__, __eq__, __ne__ all implemented the same way

custom_date.fixed_date私の考えは、ビルトインと直接比較できるようにすることdateです。

問題

custom_dateオブジェクトとオブジェクトを比較すると、date問題ありません。dateただし、オブジェクトをと比較するとcustom_dateTypeError

>>> from datetime import date
>>> x = custom_date(date(2013,2,1))
>>> y = date(2013,2,2)
>>> x > y
False
>>> y > x
TypeError: can't compare datetime.date to instance 

これを回避する方法はありますか?

4

3 に答える 3

3

なぜあなたが問題を抱えているのか、私は知っていると思います。docs.python.orgでデータ モデルのドキュメントを確認してください。

>>> y > x

呼び出し:

y.__gt__(x)

x は単なるインスタンス オブジェクトであり、そこに格納されている fixed_date 属性ではありません。

>>> x
<__main__.custom_date instance at 0x020D78C8>
>>> x.fixed_date
datetime.date(2012, 2, 1)

設定したとおりに動作させる 1 つの方法は、次のとおりです。

>>> y > x.fixed_date

これを「修正」するには、すべての日付を custom_date タイプにする必要があると思います。他の誰かがあなたにとってより良い解決策を持っているかもしれません.私も興味があるので、私は見ています.

于 2013-02-09T05:07:27.640 に答える
3

dateこの機能を取得するには、サブクラス化するだけです。__new__datetime オブジェクトは不変であるため、コンストラクタ vsを使用する必要があります__init__

from datetime import date
class custom_date(date):
    def __new__(cls, year,month,day):
        return date.__new__(cls, year, month,day)

x = custom_date(2013,2,1)
y = date(2013,2,2)

print x<y
print y<x

版画:

True
False

比較の決定クラスはLH クラスであるため、左側のクラスには、右側のクラスとの比較を処理するための正しい比較演算子が必要です。どちらのクラスにも比較演算子がない場合、インスタンスは ID (メモリ アドレス) で並べ替えられます。あなたのエラーは基本的に、リンゴとオレンジを比較しようとしたことによるものです: ID と日付クラス。

このような問題に対処するために Python 2.1で削除されたrcmp があったことに注意してください。新しいスタイル クラスの導入と豊富な比較も非推奨につながっています。__cmp__

于 2013-02-09T06:15:21.033 に答える