2

私が現在理解しているように、「+」や「-」などの算術オペランドは、整数クラスに属する特別な種類のメソッドです。算術演算をそのようにフォーマットする必要がないため、私には異なっているように見えx.__add__(y)ますx + y

私の最初の質問は次のとおりです。これまでのところ、私は正しいですか?

私の 2 番目の質問は次のとおり__add__です。メソッドで何が発生しますか? これはどのドキュメントにもありません。このメソッドは次のようなものしか想像できないため、これが無限回帰につながらないことを理解したいと思います。

def __add__(a,b):
   return a + b

しかしもちろん、「+」を説明しなかったため、無限回帰につながりました。

頭の中が少しぼやけているので、私の質問が明確であることを願っています。基本的に、私は Python の基礎が何であるかをよく理解しようとしています。(そして多分他の言語で?)

4

5 に答える 5

4

実際、Python は+and-演算子を.__add__()呼び出しに変換しますが__radd__()、逆に 2 番目のオペランドで method を使用します。これにより、カスタム型を標準型で使用する場合にオペランドにフックできます。

何が起こるかx + yは次のとおりです。

  • yが のサブクラスである場合は、最初xに試してください。y.__radd__(x)これにより、より具体的なクラスで動作をオーバーライドできます。
  • を使用してみてくださいx.__add__(y)。それが成功した場合、それが式の結果です。この呼び出しが特別なNotImplementedシングルトンを返す場合は、次のステップに進みます。
  • 使ってみてくださいy.__radd__(x); それが成功した場合、それが式の結果です。それも返された場合はNotImplementedTypeError例外が発生し、オペレーターは失敗しました。

Python の組み込み型はC コードで実装されているため、 の実際の実装によって__add__競合状態が発生することはありません。の C コードint.__add__は、C の整数値と C の+演算子を使用して、数値を加算するだけです。

カスタム Python オブジェクトでは、通常、属性やその他の値を加算することで加算を表現します。

def __add__(self, other):
    if not isinstance(other, type(self)):
        return NotImplemented  # cannot handle other types
    return type(self)(self.foobar + other.foobar + self.summation_margin)

__add__おそらく、属性には独自の実装があります。

于 2014-06-26T13:09:59.110 に答える
2

__add__(a, b)数字について:

私は Python の専門家ではありませんが、実際の計算を実行するネイティブ コードを後で呼び出すのではないかと推測しています。これは、使用している python 実装が記述されている言語で実装されています。たとえば、CPython を使用している場合、C で記述された Python のソース コードから (コンパイルされた) 関数を呼び出します。

于 2014-06-26T13:09:04.087 に答える
0

あなたは正しいです:

class Test(object):

    def __add__(self, other):
        return self + other

問題が発生します:

>>> a = Test()
>>> b = Test()
>>> a + b

Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    a + b
  File "<pyshell#27>", line 4, in __add__
    return self + other
  ...
  File "<pyshell#27>", line 4, in __add__
    return self + other
RuntimeError: maximum recursion depth exceeded

ただし、それはクラスの追加の実装方法ではありません。通常、インスタンスの追加は、属性に対する追加として定義します。たとえば、次のようになります。

class Money(object):

    def __init__(self, amount):
        self.amount = amount

    def __add__(self, other):
        return Money(self.amount + other.amount)

amount内の属性の追加は、型が何であれ、 for__add__の実装に依存しますが、次のようになります。__add__amount

>>> 1 + 2
3

カメではないと仮定できます

于 2014-06-26T13:16:34.033 に答える