15

可能重复:
访问 python int 文字方法

在 Python 中,everything is an object.

但是话又说回来,为什么以下代码段不起作用?

1.__add__(2)

但是,这确实有效:

n = 1
n.__add__(2)

n和 和有什么不一样1

它不起作用不是设计失败吗?例如,它也适用于string文字。

"one".__add__("two")

相比之下,它也适用于其他纯面向对象的语言。

让我们仔细看看这个编译 c# 的例子:

Console.WriteLine(100.ToString());

话又说回来,PythonC#的角度来看有什么区别everything is an object

4

2 回答 2

34

Python 的解析器故意非常简单——它对自身施加的约束之一是,要弄清楚一个标记的含义,它只能向右看一个标记(它是一个LL(1) 解析器)。

因此,它看到 [number][dot],并确定它是浮点文字。'_'不是浮点文字中的有效字符,因此会出现语法错误。

克服这个问题的最明显和最常见的方法是将数字放在括号中:

(1).__add__(2)

这迫使它1在解析器的限制内将 解释为整数文字,并将点解释为属性访问。

另一个有趣的解决方法是:

>>> 1 .__add__(2) 
3

也就是说,在.. 事实证明,Python 总是允许有一个空间用于任何属性查找:

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

我发现这很令人惊讶,但似乎 Python 处理.与 类似的规则+,因此会在它周围留出尽可能多的空间。

于 2012-08-19T09:47:44.113 回答
10

Python 解释1.为浮点数,因此您必须添加括号:

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

或空间:

>>> 1 .__add__(2)
3

如果你想要浮点值,只需放 2 个点。

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