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使解析器误以为它有一个浮点数,1.后面跟着单词real,因此会引发语法错误。

要对此进行测试,您也可以尝试

>> (1).real
  1

也,

>> 1.0.real
  1.0

所以在1.realpython 的情况下,将 解释.为小数点。

编辑

BasicWolf 也说得很好——1.被解释为 1 的浮点表示,所以1.real相当于写作(1.)real——所以没有属性访问运算符,即句点/句号。因此语法错误。

进一步编辑

正如 mgilson 在他/她的评论中提到的那样:解析器可以处理对int的属性和方法的访问,但前提是该语句清楚地表明它被赋予 anint而不是 a float

于 2012-08-03T19:40:51.840 回答
7

尽管 with 的行为1.real似乎不合逻辑,但由于语言规范,这是可以预料的:Python 解释1.为浮点数(请参阅浮点文字)。但正如@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 回答
7

一种语言通常分为三层。

当您向一种语言提供程序时,它首先必须“阅读”该程序。然后它将它读到的东西构建成它可以使用的东西。最后它以“程序”的形式运行该东西并(希望)打印结果。

这里的问题是python的第一部分——读取程序的部分——被混淆了。它很困惑,因为它不够聪明,无法知道两者之间的区别

1.234

1.letters

似乎正在发生的事情是,它认为您正在尝试输入一个数字,1.234但犯了一个错误并输入了字母(!)。

所以这与1“真正的”是什么以及它是否是一个对象无关。所有这些逻辑都发生在我之前描述的第二和第三阶段,当 python 尝试构建然后运行程序时。

您发现的只是 python 读取程序的一个奇怪(但有趣!)的皱纹。

[我称它为错误,但它可能是这样的。事实证明,有些东西对计算机来说很难阅读。python 的设计可能是为了让计算机可以轻松(快速)地读取程序。修复这个“错误”可能会使 python 中读取程序的部分变得更慢或更复杂。所以这可能是一个权衡。]

于 2012-08-03T20:00:54.277 回答
3

您仍然可以访问 1.real:

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