は__add__()
と__radd__()
を言って、私はいくつかの魔法のメソッドをサポートして、Foo
クラスを含むライブラリーを構築していると言う:pythonで拡張可能な魔法のベストプラクティスはありますか?
>>> class Foo(object):
... def __add__(self, rhs):
... print("Foo.__add__", rhs)
... def __radd__(self, lhs):
... print("Foo.__radd__", lhs)
...
>>> foo = Foo()
>>> foo + 3
Foo.__add__ 3
>>> 3 + foo
Foo.__radd__ 3
3 + foo
を計算する場合、Pythonは最初type(3).__add__(3, foo)
を呼び出しますが、これはNotImplemented
を返すように、それはフォールバックtype(foo).__radd__(foo, 3)
へ:
>>> type(3).__add__(3, foo)
NotImplemented
私は、開発者は自分のライブラリーの一番上のライブラリを構築できるようにしたいと思い、クラスを含むライブラリを言います、私はそれらを完全に制御してもらいたい。特に、foo + bar
がfoo.__add__(bar)
またはbar.__radd__(foo)
を呼び出すかどうかを他のライブラリが判断できるようにするメカニズムを実装したいと思います。
NumPyは__array_priority__
スキームを使用してこれを解決しました。しかし、これはいくつかの頭痛を引き起こすように思われる(これについて開かれた質問と問題の数を考慮して)。その他のベストプラクティスはありますか?
既存のクラスでも機能しますか? –
あなたの質問はかなり面白いですが、詳細が欠けています。あなたは望ましい行動のより多くの側面をdescrbeできますか? –