2016-06-01 12 views
0

親クラスを初期化して子クラスにインスタンス属性を取得する方法を理解していますが、これを達成するために舞台裏で行われていることは正確ではありません。 (ここで意図的にスーパーを使用しないで、イラストをクリアするだけです)親クラスのインスタンス属性を初期化する

class A以下は、追加の属性yを子のclass Bに追加して拡張します。 b=B()をインスタンス化した後にクラスdictを見ると、b.x(継承された)とb.yの両方が正しく表示されます。

Iはclass B__init__内これはb.x=10(通常インスタンス属性が割り当てられる方法)と同様のものを行うA.__init__(self,x=10)にコールすることによって達成されるハイレベルと仮定する。 __init__class Aであり、class Bではなく、まだclass Bであると私には少し不明ですが、それでもそれに応じてインスタンス属性が更新されます。 class A's__init__は、どのようにしてb'sインスタンス属性を更新することができますか。

bオブジェクトが明示的に継承されたメソッドを特定の名前空間に持たない継承されたメソッドとは異なりますが、見つからないメソッドが呼び出されたときに継承チェーンをルックアップします。この属性では、メソッドは実際にはbの名前空間にあります(インスタンスdictです)。

class A: 
     def __init__(self,x): 
      self.x = x 

    class B(A): 
     def __init__(self): 
      A.__init__(self,x=10) 
      self.y = 1 

    b = B() 
    print(b.__dict__) 
    >>>{x:10,y:1} #x added to instance dict from parent init 

以下は、組み込みリストから継承しています。ここでは上記と同様に、Foolistの__init__の中でリストの__init__メソッドを呼び出すので、elemsを含むインスタンス辞書が見付かると思いますが、それはどこにもありません。値123は、alistを印刷すると分かりますが、インスタンスdictでは表示されません。

class Foolist(list): 
    def __init__(self, elems): 
     list.__init__(self, elems) 

alist = Foolist('123') 

だから、親の__init__が子供の__init__から呼び出されたときに正確に継承クラスで何が起こっているのか?値はどのように縛られていますか?オンデマンドで継承チェーンを検索するのではなく、継承するクラスのインスタンスdictに実際に値を割り当てるので、メソッドルックアップとは違うようです。

親のinitへの呼び出しは、その子のインスタンスのdictをどのように記入しますか?なぜFoolistの例はこれをしないのですか?

答えて

2

答えは簡単です:self

非常に概観として、クラスをインスタンス化するとき、オブジェクトが作成されます。これは文字通り、何かに関係のない空のコンテナです。*この "空のコンテナ"は、インスタンス化されているクラスの__init__メソッドに渡されます。ここでは、self引数になります。次に、そのオブジェクトの属性を設定します。次に、別のクラスの__init__メソッドを呼び出すと、は特定のselfオブジェクトをそのメソッドに明示的に渡します。そのメソッドはオブジェクトに別の属性を追加します。

これは実際どのインスタンスメソッドもどのように動作するかです。各メソッドは暗黙のうちに、最初の引数である "現オブジェクト"をselfとして受け取ります。親の__init__メソッドを呼び出すときは、実際にそのオブジェクトを非常に明示的に渡しています。あなたはこの単純な例でその動作を近似することができる

:オブジェクトは完全に「空」ではありません*

def init_a(obj): 
    obj.x = 10 

def init_b(obj): 
    init_a(obj) 
    obj.y = 20 

o = {} 
init_b(o) 

、特定のクラスとの提携を作成したオブジェクトに設定され、特定の属性がありますオブジェクトは特定のクラスの「インスタンス」なので、Pythonは必要に応じてクラスから継承するすべてのメソッドを見つけることができます。

関連する問題