2017-04-03 90 views
1

您好,我对通过Python的类中的方法__init__方法有疑问。人们会说这是类实例正在作为__init__方法中的第一个参数在这里传递。Python中类的__init__方法中的self是什么?

Class A(): 

    def __init__(self): 
     pass 

    def check(self): 
     pass 

a = A() 
a.check() 

因为我们理解,此处“A”为被传递的第一个参数的方法__init__。但是在这里我们刚刚创建了类A的实例。至于其他方法检查,当我们要做a.check()时,会理解好,我们在这里调用一个类的实例来调用,以便它被传递。但对于__init__方法,我们没有做任何事情,只是创建了实例。那么它是如何通过的。

举一个例子, a = a + 10 ...直到这个表达式才开始初始化。与__init__一样。

我们刚刚在这里创建了实例a = A()。那么会通过这里。

我知道我的问题有点棘手。但是这个问题在我的采访中被问到了。

请有人可以帮忙吗?

+0

除'__new__'被覆盖(或使用元类),禁用此行为。构造对象时,__init__'总是被**调用。它像一个*构造函数*(就像在Java中一样)。 –

+0

hi @WillemVanOnsem ..感谢您的回答,我知道这是与java相同的构造函数。但我的问题有点不同。喜欢了解自我如何作为第一个参数被传递,如果我们没有用这个参数来调用这个方法。 – Anendra

回答

6

不会a会通过,类实例通过。该实例在分配给a之前已存在。它独立存在于a。就拿:

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

会有的创建A 5分的情况下,即使他们不直接分配给任何变量(列表中的表达可以被分配,但每一个人A()不是)。

当实例化一个类,这个类的__new__创建新实例,然后调用它__init__,那么新的实例返回和(你的情况)分配给a(用于更深入的细节见https://stackoverflow.com/a/43187010/476)。

+0

我也会提及'__new__',它有助于理解'__init__'的真正作用。好工作 – sadmicrowave

+0

感谢您的解释。 @deceze。合理。 – Anendra

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)的(初始化)对象。
+0

感谢您的解释。 – Anendra

相关问题