【问题标题】:int('123') in python - is it a function call or constructor call of 'int' class?python中的int('123') - 它是'int'类的函数调用还是构造函数调用?
【发布时间】:2016-11-19 10:01:15
【问题描述】:

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

'Python 中的一切都是对象'

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

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

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

【问题讨论】:

  • 在 Python 解释器中尝试help(int)。这是一堂课。
  • 感谢 smarx,我明白了 :) 我是初学者而且与众不同 - 2 个术语让我感到困惑 :)
  • 旁注:1"x" 等都是文字。

标签: python types python-3.4


【解决方案1】:

是的,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 对象的references 放入列表中。

使用标准的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() 方法。

【讨论】:

  • 只是一个小错误(根据我的说法):the interpreter creates the 3 int objects and puts them inside a fresh list instance. 它没有将对象放入列表中,而是保留在列表中的对象的引用。
  • @PranjalKumar 我已经更新了我的答案。我最初没有提到引用,因为我们总是在 Python 中使用对象引用,讨论这个话题是另一个问题。 ;)
  • 你知道为什么使用文字和类时反汇编不同吗?例如 dis("x = 1000") 不同于 dis("x = int(1000)")
  • @IKnewThat 为什么不应该有所不同?如果您的代码说要调用int(1000),那么解释器会执行该调用并返回结果。尽管int(1000) 通常会调用内置的 int 构造函数,但可以“隐藏”该内置名称。例如,考虑一下如果你这样做会发生什么int = str; x = int(1000)
【解决方案2】:

正如您在 python 中看到的那样documentation

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

所以它是一个类构造函数,根据给定的输入 x 构造一个 int 对象。

【讨论】:

  • 感谢 DJanssens :),所以当我们创建数据类型时,实际上我们是在创建它们的类的对象?例如:- x = [] 所以 x 是一个列表类对象?对,并且在其他数据类型中更相似,因为这就是我们可以在它们上调用方法的原因? x.index('aa') ?
  • 是的@vikram,一些对象的创建经常是他们为它制作的文字。因此,您可以执行 x = 3,这将在封面下创建一个 int 对象。列表和任何其他 python 类型也是如此。
猜你喜欢
  • 2015-09-25
  • 2013-06-12
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2021-11-08
  • 1970-01-01
  • 2017-12-12
相关资源
最近更新 更多