为什么1 .__添加__(2)不能解决?

poi*_*oae 15 python literals operator-keyword

可能重复:
访问python int literals方法

在Python中everything is an object.

但话又说回来,为什么下面的代码片段不起作用?

1.__add__(2)
Run Code Online (Sandbox Code Playgroud)

但是,这确实有效:

n = 1
n.__add__(2)
Run Code Online (Sandbox Code Playgroud)

n和之间有什么区别1

这不是一个设计失败,它不起作用?例如,它也适用于string文字.

"one".__add__("two")
Run Code Online (Sandbox Code Playgroud)

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

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

Console.WriteLine(100.ToString());
Run Code Online (Sandbox Code Playgroud)

那么,Python从什么C#角度来区别everything is an object

lvc*_*lvc 33

Python的解析器故意非常简单 - 它对自身强制执行的约束之一是,为了弄清楚令牌的含义,它只能向右看一个令牌(它是一个LL(1)解析器).

因此,它看到[number] [dot],并确定它是一个浮点文字.'_'在浮点文字中不是有效字符,因此它会产生语法错误.

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

(1).__add__(2)
Run Code Online (Sandbox Code Playgroud)

这会强制它1在解析器的限制内将其解释为整数文字,将点解释为属性访问.

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

>>> 1 .__add__(2) 
3
Run Code Online (Sandbox Code Playgroud)

也就是说,在之前添加一个空格..事实证明,Python总是允许在那里进行任何属性查找:

>>> range(4) .count(3)
1
Run Code Online (Sandbox Code Playgroud)

我发现这非常令人惊讶,但似乎Python .在类似的规则下处理+,因此将允许尽可能多的空间围绕它.

  • 严格来说,是词法分析者需要决定是否"." 是浮点文字或分隔符标记的一部分. (4认同)

app*_*tor 10

Python解释1.为float,因此您必须添加parens:

>>> (1).__add__(2)
3
Run Code Online (Sandbox Code Playgroud)

或空间:

>>> 1 .__add__(2)
3
Run Code Online (Sandbox Code Playgroud)

如果你想浮动值,这里只需要2个点.

>>> 1..__add__(2) #float
3.0
Run Code Online (Sandbox Code Playgroud)