web-dev-qa-db-ja.com

pythonでの演算子のオーバーロード

可能性のある重複:
Python:独自の演算子を定義しますか?
Pythonで演算子のオーバーロードを使用する場合の経験則

Pythonで演算子をオーバーロードすることは可能ですか?その場合、++<<などの新しい演算子を定義できますか?

43
Ahmad Dwaik

他の答えが述べたように、実際に演算子をオーバーロードできます(作成しているクラスの特別なメソッド、つまり名前が2つのアンダースコアで始まるメソッドとメソッドを定義することによって)。詳細はすべて ここ です。

質問への回答を完了するには、新しい演算子を定義できません。しかし、<<は新しい演算子ではなく、既存の演算子です。クラスでメソッドを定義することでオーバーロードされます __lshift__

歴史的なメモとして、これはC++の状況でもありますが、オーバーロードできる演算子の正確なセットは2つの言語間で異なります。たとえば、C++では、属性アクセスをオーバーロードすることはできません。.; Pythonでは、__getattr__(または__getattribute__、異なるセマンティクス)および__setattr__。逆に、Python =(プレーン割り当て)は演算子ではないため、オーバーロードすることはできませんが、C++では演算子であり、オーバーロードすることができます。

<<は演算子であり、両方の言語でオーバーロードできます。これが<<および>>は、左シフトと右シフトの最初の意味を失わずに、C++のI/Oフォーマット演算子にもなりました(Pythonではありません!-)。

71
Alex Martelli

参照: http://docs.python.org/reference/datamodel.html#special-method-names .

クラスは、特別な名前のメソッドを定義することにより、特別な構文(算術演算、添え字付け、スライスなど)によって呼び出される特定の操作を実装できます。これは、演算子のオーバーロードに対するPythonのアプローチであり、クラスが言語演算子に関して独自の動作を定義できるようにします。

6
miku

はいといいえ。独自の演算子を定義できるとは思いませんが、既存の演算子をオーバーロードすることができます-演算子の特別なメソッドをオーバーライドすることでそれを行うことができます。たとえば、>をオーバーライドするには、__gt__()をオーバーライドできます。!= for __ne__()などをオーバーライドできます。

4
Sudhir Jonathan