Pythonで++演算子をオーバーロードすることは可能ですか?
5 に答える
++
Python には演算子はありません(「--」も)。インクリメントは通常、+=
代わりに演算子で行われます。
いいえ、Python では演算子ではないため、単項 ++ 演算子をオーバーロードすることはできません。
Python 構文で許可されている演算子 (言語で既に 1 つ以上の用途がある演算子) のみ (のサブセット) をオーバーロードできます。
これらは有効な Python 演算子であり、このページではそれらをオーバーロードするために定義できるメソッド (先頭と末尾に 2 つのアンダースコアがあるもの) を一覧表示します。
他の言語で一般的に使用される i++ の代わりに、Python では i += 1 と書きます。
Python では、+ 記号の右側にオペランドが必要です。左側にオペランドがある場合もあり、その場合は単項演算子ではなく二項演算子として解釈されます。+5、++5、...、++++++5 はすべて有効な Python 式 (すべて 5 に評価される) であり、7 + 5、7 ++ 5、...、7 ++++ も同様です。 ++++ 5 (すべて 7 + (+...+5) = 12 と評価されます)。5+ は有効な Pythonではありません。この質問も参照してください。
別のアイデア: ++ 演算子を実際に使用したい目的に応じて、単項 (プレフィックス) プラス演算子のオーバーロードを検討することをお勧めします。これにより、奇妙なコードになる可能性があることに注意してください。あなたのコードを見ている他の人は、おそらく何もしないと思い込んで混乱するでしょう。
誰もが良い点を挙げていますが、もう 1 つだけ明確にしたいと思います。Python インタープリターを開いて、これを確認してください。
>>> i = 1
>>> ++i
1
>>> i
1
Python には ++ (または --) 演算子はありません。(構文エラーではなく) このように動作する理由は、 + と - が有効な単項演算子であり、基本的に数字に対する符号のように動作するためです。++i
「+(+i)」や--i
「-(-i)」と考えることができます。他の言語と同じように動作することを期待++i
すると、非常に陰湿なバグハントにつながります。C プログラマー: 注意してください。
ストレートi++
オアi--
は十分に失敗しますが、それだけの価値があります。
あなたはそれをハックすることができますが、これはいくつかの望ましくない結果をもたらします:
class myint_plus:
def __init__(self,myint_instance):
self.myint_instance = myint_instance
def __pos__(self):
self.myint_instance.i += 1
return self.myint_instance
class myint:
def __init__(self,i):
self.i = i
def __pos__(self):
return myint_plus(self)
def __repr__(self):
return self.i.__repr__()
x = myint(1)
print x
++x
print x
出力は次のとおりです。
1
2
++ 演算子は Python には存在しないため、オーバーロードすることはできません。
次のようなことをするとどうなりますか。
1 ++ 2
実際には
1 + (+2)