14

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

Python ではすべてがオブジェクトです。数値でさえオブジェクトです:

>>> a=1
>>> type(a)
<class 'int'>
>>>a.real
1

オブジェクトのクラスメンバーにアクセスできるはずなので、次のことを試しました。

>>> type(1)
<class 'int'>
>>> 1.real
  File "<stdin>", line 1
    1.real
         ^
SyntaxError: invalid syntax

これが機能しないのはなぜですか?

4

4 に答える 4

19

はい、整数リテラルはPythonのオブジェクトです。要約すると、パーサーは整数型のオブジェクトを扱っていることを理解できる必要がありますが、ステートメント1.realはパーサーを混乱させて float1.の後に単語が続くと考えさせreal、構文エラーを発生させます。

これをテストするには、試すこともできます

>> (1).real
  1

としても、

>> 1.0.real
  1.0

そのため、python の場合、は小数点として1.real解釈されます。.

編集

BasicWolf もうまく表現しています - 1.1 の浮動小数点表現として解釈されているため1.real、書き込みと同等です(1.)real- したがって、属性アクセス演算子、つまりピリオド/終止符はありません。したがって、構文エラー。

さらに編集

mgilson がコメントで言及しているように、パーサーは の属性とメソッドへのアクセスを処理できますが、ステートメントが ではなくintが与えられていることを明確にしている場合に限ります。intfloat

于 2012-08-03T19:40:51.840 に答える
7

言語は通常、3 つの層で構築されます。

プログラムを言語に提供する場合、最初にプログラムを「読み取る」必要があります。次に、読み取ったものを操作できるものに構築します。そして最後に、それを「プログラム」として実行し、(できれば) 結果を出力します。

ここでの問題は、Python の最初の部分 (プログラムを読み取る部分) が混乱していることです。の違いを知るほど賢くないので、混乱しています。

1.234

1.letters

何が起こっているように見えるのは、あなたが数字を入力しようとして1.234いたが、間違いを犯し、代わりに文字を入力したと考えていることです(!)。

1したがって、これは「実際に」何であるか、およびそれがオブジェクトであるかどうかとは何の関係もありません。そのようなロジックはすべて、先ほど説明した第 2 段階と第 3 段階で発生し、Python はプログラムをビルドして実行しようとします。

あなたが発見したのは、Python がプログラムを読み取る方法の単なる奇妙な (しかし興味深い!) しわです。

【バグと言いますが、こんな感じなのかもしれません。コンピューターにとって読みにくいものがあることが判明しました。python はおそらく、コンピューターがプログラムを簡単に (高速に) 読み取れるように設計されています。この「バグ」を修正すると、プログラムを読み取る python の部分が遅くなったり、複雑になったりする可能性があります。したがって、おそらくトレードオフです。]

于 2012-08-03T20:00:54.277 に答える
7

の動作1.realは論理的ではないように見えますが、言語仕様により予期されます: Python1.は float として解釈します (浮動小数点リテラルを参照)。しかし、@mutzmatron が指摘したよう(1).realに、括弧内の式は有効な Python オブジェクトであるため機能します。

更新:次のピットに注意してください:

1 + 2j.real
>>> 1.0      # due to the fact that 2j.real == 0
# but
1 + 2j.imag  
>>> 3.0      # due to the fact that 2j.imag == 2
于 2012-08-03T19:45:33.470 に答える
3

1.real には引き続きアクセスできます。

>>> hasattr(1, 'real')
True
>>> getattr(1, 'real')
1
于 2012-08-03T19:55:18.877 に答える