我已经读过python中的所有东西都是一个对象,因此我开始尝试不同的类型并调用__str__它们 - 起初我感到非常兴奋,但后来我感到困惑.
>>> "hello world".__str__()
'hello world'
>>> [].__str__()
'[]'
>>> 3.14.__str__()
'3.14'
>>> 3..__str__()
'3.0'
>>> 123.__str__()
File "<stdin>", line 1
123.__str__()
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
something.__str__()除了"一切"之外还要工作int?123不是一个对象类型的int?所以我在twitter上看到了这两个 问题.如何1.real语法错误但1 .real不是?
>>> 1.real
File "<stdin>", line 1
1.real
^
SyntaxError: invalid syntax
>>> 1 .real
1
>>> 1. real
File "<stdin>", line 1
1. real
^
SyntaxError: invalid syntax
>>> 1 . real
1
>>> 1..real
1.0
>>> 1 ..real
File "<stdin>", line 1
1 ..real
^
SyntaxError: invalid syntax
>>> 1.. real
1.0
>>> 1 .. real
File "<stdin>", line 1
1 .. real
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud) 可能重复:
访问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?
可能重复:
访问python int literals方法
Python中的所有东西都是一个对象.甚至一个数字也是一个对象:
>>> a=1
>>> type(a)
<class 'int'>
>>>a.real
1
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容,因为我们应该能够访问对象的类成员:
>>> type(1)
<class 'int'>
>>> 1.real
File "<stdin>", line 1
1.real
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?
我们知道一切都是Python中的对象,因此包括整数.这样做dir(34)并不奇怪,有可用的属性.
我的困惑源于以下内容,为什么34.__class__当我知道34确实具有该属性时,do 会给出语法错误__class__.此外,为什么将一个整数绑定到一个名称,比如说x,然后x.__class__产生我期望的int类型的答案?
在python中,调用方法或直接在文字上查找属性是可能的,有时甚至是常见的:
>>> "-".join("abc")
'a-b-c'
>>> {1: 3, 2: 9}.pop(1)
3
>>> 3j.imag
3.0
>>> 8.0.__add__(8)
16.0
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,这不适用于整数对象:
>>> 3.__add__(42)
File "<stdin>", line 1
3.__add__(42)
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
为什么不?
我只能在将数字绑定到名称时调用数字上的方法:
>>> a = 5
>>> a.bit_length()
3
Run Code Online (Sandbox Code Playgroud)
我可以调用字符串文字的方法:
>>> 'Hello World'.lower()
'hello world'
Run Code Online (Sandbox Code Playgroud)
但是我不能在数字文字上调用方法:
>>> 5.bit_length()
Run Code Online (Sandbox Code Playgroud)
这提出了一个SyntaxError.是否有实际的理由,还是历史性的?
编辑刚刚找到这个相关的问题,显示了解决方法(这里也已经提出过).我想这也回答了主要问题 - 通过简单的解决方法,可能没有足够的好处使语法更复杂(并且更难解析)来使这项工作.
我可以str在字符串文字上调用方法.但我不能int在整数数字文字上调用方法:
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
>>> 1.bit_length()
File "<stdin>", line 1
1.bit_length()
^
SyntaxError: invalid syntax
>>> a = 1
>>> a.bit_length()
1
>>> ', '.join(['1', '2'])
'1, 2'
>>>
Run Code Online (Sandbox Code Playgroud)
这是为什么?