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

时间:2012-08-19 09:34:55

标签: python operator-keyword literals

  

可能重复:
  accessing a python int literals methods

在Python中,everything is an object

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

1.__add__(2)

然而,这确实有效:

n = 1
n.__add__(2)

n1之间的区别是什么?

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

"one".__add__("two")

为了进行比较,它也适用于其他纯面向对象的语言。

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

Console.WriteLine(100.ToString());

然后,从Python的角度来看,C#everything is an object的区别是什么?

2 个答案:

答案 0 :(得分:32)

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

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

最明显也是最常见的解决方法是将数字放在括号中:

(1).__add__(2)

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

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

>>> 1 .__add__(2) 
3

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

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

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

答案 1 :(得分:9)

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

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

或空格:

>>> 1 .__add__(2)
3

如果你想要漂浮值,只需加2点。

>>> 1..__add__(2) #float
3.0