python中的int('123') - 是'int'类的函数调用还是构造函数调用?

时间:2016-07-16 07:26:24

标签: python types python-3.4

我正在学习Python,我对Python的数据类型有点困惑。我一次又一次地读这行。

  

'一切都是Python中的对象'

这包括整数,浮点数,字符串,集合,列表等。当我们这样写:[1, 2, 3]时,我们实际上创建了list类(或不是)的对象?那么,当我们写一个像123这样的整数时,它是否意味着它是int类的对象?但是当我们在书中读到它说要将字符串转换为整数时我们需要使用int方法吗?

但我想的是int是一个类,它也接受构造函数中的字符串对象,然后我们得到整数对象,对吗?

那么,int是Python中的方法或类吗?

2 个答案:

答案 0 :(得分:6)

int是一个类(它也称为类型;请参阅Python : terminology 'class' VS 'type'),而int('123')执行int对象的实例。

但是,(在标准Python中称为CPython)对于小整数(范围在-5到256之间),int构造函数实际上并不构建新的整数对象。出于效率原因,解释器具有小整数的缓存,构造函数只返回对现有int对象的引用。 “is” operator behaves unexpectedly with integers的答案中讨论了该主题。

你的书叫int()int方法”有点草率,恕我直言。从迂腐的角度来说,int本身就是一个类,它是一个可调用的对象,当你调用一个类时,调用会自动转换为对类的构造函数方法的调用(即它的__new__方法) 。但非正式地,将int()称为函数调用或方法调用是很常见的。

我几乎忘记了你的第一段中的问题。我们写的时候

[1, 2, 3]

解释器创建3个int对象并将它们放在一个新的list实例中。 (更准确地说,它将引用放入列表中的int个对象。)

使用标准dis module,您可以反汇编此操作的字节码:

from dis import dis
dis('a=[1,2,3]')    

<强>输出

  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 (2)
              6 LOAD_CONST               2 (3)
              9 BUILD_LIST               3
             12 STORE_NAME               0 (a)
             15 LOAD_CONST               3 (None)
             18 RETURN_VALUE

因此即使我们“只是”创建一个文字列表,它仍然是一个完全成熟的list实例对象。与某些OOP语言不同,Python没有任何不是对象的“原始”数据类型,因此文字整数和文字字符串也是对象。因此,文字字符串配备了所有标准字符串方法。例如,

print('hello'.lower)

<强>输出

built-in method lower of str object at 0xb72e7880>

向我们展示了文字字符串'hello'具有标准lower()方法。

答案 1 :(得分:2)

正如您可以阅读python documentation

  

class int(x,base = 10)返回一个由a构造的整数对象   数字或字符串x,如果没有给出参数,则返回0。如果x是a   number,可以是普通整数,长整数或浮点数   数。如果x是浮点,则转换将截断为零。   如果参数超出整数范围,则函数返回a   相反,长对象。

所以它是构造一个int对象的类构造函数,具体取决于给定的输入x。