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