Python中一个类的__init__方法中的self是什么?

时间:2017-04-03 14:05:58

标签: python python-2.7 function class oop

我怀疑在python类中传递的参数是__init__方法。人们会说这是类实例在这里作为__init__方法中的第一个参数传递。

Class A():

   def __init__(self):
       pass

   def check(self):
      pass

a = A()
a.check()

我们知道这里' a'正如方法__init__中的第一个参数一样传递。但是在这里我们刚刚创建了A类的实例。对于其他方法检查,当我们执行a.check()时,将理解OK,这里我们正在调用类的实例检查,因此它正在被传递。但对于__init__方法,我们没有做任何事情,只是创建了实例。那么它是如何被传递的。

举个例子, a = a + 10 ......除非我们将初始化此表达式的开头,否则这将无法工作。和__init__一样。

我们刚刚在这里创建了a = A()的实例。然后将通过这里。

我知道我的问题有点棘手。但是在接受采访时我已经问过了。

请有人帮忙吗?

2 个答案:

答案 0 :(得分:6)

不会传递a,传递类实例。实例在分配给a之前存在。它独立于a存在。举个例子:

[A() for _ in range(5)]

将创建5个A个实例,即使它们没有直接分配给任何变量(列表表达式可能已分配,但每个A()不是)。

实例化类时,该类的__new__创建新实例,然后在其上调用__init__,然后返回新实例并(在您的情况下)分配给a (有关详细信息,请参阅https://stackoverflow.com/a/43187010/476)。

答案 1 :(得分:5)

此示例中的步骤顺序(假设标准元类type)为

  1. A()是使用type.__call__(A)实现的。
  2. type.__call__(A)来电A.__new__
  3. A.__new__解析为object.__new__,后者返回A的新实例。
  4. type.__call__(A)object.__new__的返回值传递给A.__init__(其中self是第一个参数用于__init__的名称)。
  5. type.__call__(A)然后返回(初始化的)对象,该对象绑定到名称a