2016-07-04 6 views
2

:我々は、オブジェクトmy_teslaを作成するとPythonのsuper()、どういうことが起こりますか?私は例えば、私たちはPythonで子クラスをインスタンス化するときに作成されているものをオブジェクトを理解しようとしています

class Car(): 
    def __init__(self, make, model, year): 
     self.make = make 
     self.model = model 
     self.year = year 

class ElectricCar(Car): 
    def __init__(self, make, model, year): 
      super().__init__(make, model, year) 

my_tesla = ElectricCar('tesla', 'model s', 2016) 

、私たちは、このクラスのコンストラクタを呼び出すことにより、クラスElectricCarをインスタンス化し、彼は順番に親のコンストラクタを呼び出します。それはどうやって起こるの?今度は2つの推測があります:

1)super()は親クラスへの参照に過ぎないので、親のコンストラクタを "super()。init(make、model、year)"と呼びます。私たちの子クラスをインスタンス化します。その結果、私たちのクラスElectricCar()のONEオブジェクトが得られました。

2)super()、親のコンストラクタを呼び出して、 "Car"クラスのオブジェクトを作成してから、このオブジェクトのコンストラクタを "super()。init(make、年)"。その結果、2つのオブジェクト:Car()クラスの1つのオブジェクトとElectiricCarクラスの1つのオブジェクト(この場合は同じですが)。

どちらが正しいですか?どちらも、その後、正確に何が起こるかを説明していないしてください場合は :

super().__init__(make, model, year) 
+3

いいえ。あなたはまだ1つのオブジェクト、 'ElectricCar'しか持っていません。コンストラクタは他のどのような関数でもあります。それはあなたのためのオブジェクトを "作成"しません - コンストラクタが実行される頃には、そのオブジェクトは基礎となるランタイムによって既に作成されていました。コンストラクタはその新しいオブジェクトをINITIALIZEするためのものです。 super().__ init__を呼び出すだけで、単純なオブジェクトメソッドが実行されます。そのメソッドがコンストラクタであるという事実は無関係です。それはオブジェクトビルダーによって自動的に実行されるときだけコンストラクタです。 –

+1

http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods – jbat100

答えて

3

__init__はコンストラクタではありません、それは初期化子です。 __init__が呼び出されるまでに、オブジェクトは既に(__new__を介して)構築されています。したがって、オブジェクトは1つだけ取得されますが、2回初期化されます。たとえば、ElectricCar.__init__は、Car.__init__の実行後にself.modelを再初期化することができます。

を呼び出すと、適切なベースクラスが現在のインスタンスのコンテキストで参照されます。あなたの例では、super().__init__(make, model, year)は基本的にCar.__init__(self, make, model, year)と書き直すことができました。以前のバージョンのPythonで、呼び出しが実際にsuper(ElectricCar, self)た理由

はこれがある - それは現在のクラス(ElectricCar)の基底クラスを検索し、それが代わりにそのクラスのインスタンスであるかのように現在のインスタンス(self)を使用しています。

初期化とは、オブジェクトを準備することではなく、オブジェクトの状態を準備することです。 __init__が実装されていなくてもオブジェクトは完全に機能します。


明確にする:あなたはElectricCar()を呼び出すと、どのような実際に実行されると、これに近いです:

that_object = ElectricCar.__new__() # this will actually use object.__new__ 
if isinstance(that_object, ElectricCar): 
    ElectricCar.__init__(that_object) 
return that_object 

通話ElectricCar.__new__から1つのオブジェクトを持っていることを意味します。 ElectricCar.__init__の呼び出しは、そのオブジェクトを変更/初期化するだけです。それはCar.__init__のような他の機能を使って行うことができます。

+0

したがって、2つのクラスのオブジェクトはどのような場合でも作成されますか?そして: super().__ init __(make、model、year) ElectricCarオブジェクトを初期化するだけですか?その結果、Carクラスの1つのオブジェクトが初期化されず、ElectricCarクラスのオブジェクトが初期化されます。 –

+0

'* ElectricCar()'を呼び出すと、* one *オブジェクトだけが作成されます。 *そのオブジェクトは 'that_object .__ init __()'として使用され、superを使って 'Car .__ init __(self = that_object)'を呼び出す 'ElectricCar .__ init __(self = that_object)'に解決されます。 – MisterMiyagi

関連する問題