3

Pythonで*演算子をオーバーロードしたい。C ++では、間接参照演算子をオーバーロードできるため、に応答するカスタムの方法でクラスを作成できます*alpha

この質問の一部は、私が正確にわからないということです。つまり、*演算子(私が呼んでいるアンパック演算子)が何をするのかを正確に意味します。

では、どうすればオーバーロードするか、オーバーロードをエミュレートできますか。

*alpha最終的には、カスタム応答と戻り値を使用して実行できるようにしたいと考えています。


編集:

JoeKingtonのコメントのおかげで解決策を見つけました。*alphaに従って解凍するので、これ__iter__を可能にするために継承できる単純なクラスを定義しました。

ところで、これができるようにしたいのは、きれいなインターフェースが欲しかったからです。

class Deref:
  def __deref__(self):
    pass

  def __iter__(self):
    yield self.__deref__()

class DerefTest(Deref):
  def __deref__(self):
    return '123cat'

if __name__ == '__main__':
  print(*DerefTest()) # prints '123cat'

結局、私が与えた実装がすべての場合に機能するとは限らないので、私は別の単項演算子を使用することに決めました。それで私はがっかりしました。

4

2 に答える 2

6

*単項と**「演算子」を正しく理解していないと思います。

リスト/dictを関数の引数/キーワードの引数に解凍します。この文脈で意味のあるものは他にありません。したがって、それらをオーバーロードすることはできません。

実際、それらを使用することは、関数宣言/呼び出し以外の場所では構文エラーです。

于 2012-03-15T14:58:00.870 に答える
0

もしかして

class Pointer(object):
    def __init__(self, pointee):
        self.pointee = pointee

    def deref(self):
        return self.pointee

あなたが望むものではありませんか?

上で定義*ptrするのではなく、そのまま書くことの利点について具体的に教えてください。ptr.deref()

于 2012-03-15T15:16:41.900 に答える