在Python中,everything is an object
。
但话又说回来,为什么下面的代码片段不起作用?
1.__add__(2)
然而,这确实有效:
n = 1
n.__add__(2)
n
和1
之间的区别是什么?
它是不是设计失败,它不起作用?
例如,它也适用于string
文字。
"one".__add__("two")
为了进行比较,它也适用于其他纯面向对象的语言。
让我们仔细看看这个编译c#示例:
Console.WriteLine(100.ToString());
然后,从Python
的角度来看,C#
与everything is an object
的区别是什么?
答案 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