15

重複の可能性:
python int リテラル メソッドへのアクセス

パイソンでは、everything is an object.

しかし、繰り返しになりますが、次のスニペットが機能しないのはなぜでしょうか?

1.__add__(2)

ただし、これは機能します。

n = 1
n.__add__(2)

nとはどう違い1ますか?

動かないのは設計ミスじゃないの?たとえば、stringリテラルでも機能します。

"one".__add__("two")

比較のために、他の純粋なオブジェクト指向言語でもうまく機能します。

このコンパイルの c# の例を詳しく見てみましょう。

Console.WriteLine(100.ToString());

もう一度言いますが、の観点から見たPython場合との違いは何ですか?C#everything is an object

4

2 に答える 2

34

Python のパーサーは意図的に非常に単純です。それ自体に強制する制約の 1 つは、トークンが何を意味するかを理解するために、右側に 1 つのトークンしか見えないということです (これはLL(1) パーサーです)。

したがって、[数値][ドット] を見て、浮動小数点リテラルであると判断します。'_'は浮動小数点リテラルに有効な文字ではないため、構文エラーが発生します。

これを克服するための最も明白で最も一般的な方法は、数字を括弧で囲むことです。

(1).__add__(2)

これ1により、パーサーの制限内で、 を整数リテラルとして解釈し、ドットを属性アクセスとして解釈する必要があります。

別の興味深い回避策は次のとおりです。

>>> 1 .__add__(2) 
3

つまり、.の前にスペースを追加し.ます。Python では、属性検索用にスペースを常に許可していることがわかります。

>>> range(4) .count(3)
1

これは非常に驚くべきことでしたが、Python は.と同様のルールで処理+するようで、周囲に好きなだけスペースを許可します。

于 2012-08-19T09:47:44.113 に答える
10

Python は1.float として解釈するため、括弧を追加する必要があります。

>>> (1).__add__(2)
3

またはスペース:

>>> 1 .__add__(2)
3

ここに float 値が必要な場合は、2 つのドットを入力します。

>>> 1..__add__(2) #float
3.0
于 2012-08-19T10:12:59.823 に答える