2017-04-03 5 views
1

私は引数が渡​​されたことに疑問を持っています__init__ pythonのクラスでメソッドです。人々はこれがクラスインスタンスが__init__メソッドの最初の引数としてここに渡されていると言うでしょう。Pythonのクラスの__init__メソッドの自己は何ですか?

Class A(): 

    def __init__(self): 
     pass 

    def check(self): 
     pass 

a = A() 
a.check() 

我々はここで「」方法__init__の最初の引数のように渡されていることも理解されるように。しかし、ここでクラスAのインスタンスを作成しました。他のメソッドのチェックは、a.check()を実行するとOKになります。ここでクラスのインスタンスをチェックして渡されます。 __init__メソッドでは、何もしなかっただけでインスタンスを作成しました。どのようにそれが渡されているのですか?

例: a = a + 10 ...これは、この式の開始でaを初期化するまで、動作しません。 __init__と同じです。

ここでインスタンスを作成したのは、= A()です。ここにaが渡されます。

私の質問はちょっと難しいです。しかし、これは私にインタビューで尋ねられました。

ここで助けてもらえますか?

+0

「__new__」がオーバーライドされている(またはメタクラスが使用されている)場合を除いて、この動作は無効になります。 '__init__'は、オブジェクトを構築するときに**常に**呼び出されます。これは*コンストラクタ*(Javaの場合など)のように動作します。 –

+0

hi @WillemVanOnsem ..あなたの答えをありがとう、私はこれがjavaと同じコンストラクタであるという事実を認識しています。しかし、私の質問は少し違う。この引数でこのメソッドを呼び出さなかった場合、最初の引数としてここで自己がどのように渡されているかを理解するのが好きです。 – Anendra

答えて

6

aが渡されます。インスタンスはaに割り当てられる前に存在します。それはaから独立して存在します。例えば取る:

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

(リスト式が割り当てられてもよいが、各個人A()ではない)、彼らが直接任意の変数に割り当てられていないにもかかわらず、作成Aの5件のインスタンスがあります。クラスをインスタンス化する場合

、そのクラスの__new__は、新しいインスタンスを作成し、その後、新しいインスタンスが(多くのための綿密な詳細はhttps://stackoverflow.com/a/43187010/476を参照)を返し、(あなたのケースで)aに割り当てられ、それに__init__を呼び出します。

+0

私も '__new__'について言及するつもりでしたが、' __init__'が実際にどのように動作するかを理解するのに役立ちます。良い仕事 – sadmicrowave

+0

この説明をありがとう。 @deceze。意味をなさない – Anendra

5

この例では(標準メタクラスtypeと仮定して)ステップの順序はtype.__call__(A)を使用して実装され

  1. A()あります。
  2. type.__call__(A)A.__new__となります。
  3. A.__new__は、Aの新しいインスタンスを返すobject.__new__に解決されます。
  4. type.__call__(A)は(self__init__この最初の引数に使用される名前である)A.__init__からobject.__new__の戻り値を渡します。
  5. type.__call__(A)は、aという名前でバインドされた(初期化された)オブジェクトを返します。
+0

説明をありがとう。 – Anendra

関連する問題