Pythonの初期化がどのように機能するかを理解するために少し助けが必要です。フィールド/変数として別のクラス(Foo)を持つクラス(Bar)があります。この変数を(クラス__init__ではなく)Barで直接初期化しようとすると、Barのすべてのインスタンスが同じFooを指します。ただし、Bar2のように__init__メソッドがある場合、各Bar2インスタンスには一意のFooインスタンスがあります。ここで何が起きてるの?
class Foo():
number = 0
class Bar():
foo = Foo()
class Bar2():
foo = None
def __init__(self):
self.foo = Foo()
first = Bar()
second = Bar()
print "Bar"
print first
print second
print first.foo
print second.foo
first = Bar2()
second = Bar2()
print "\nBar2"
print first
print second
print first.foo
print second.foo
たとえば、出力は次のようになります。
Bar
<\__main__.Bar instance at 0x025B2AF8>
<\__main__.Bar instance at 0x025B2B20>
<\__main__.Foo instance at 0x004A3AA8>
<\__main__.Foo instance at 0x004A3AA8>
Bar2
<\__main__.Bar2 instance at 0x025B2B48>
<\__main__.Bar2 instance at 0x025B2AF8>
<\__main__.Foo instance at 0x025B2B70>
<\__main__.Foo instance at 0x025B2B98>
Barを使用すると、両方のインスタンスが同じFooインスタンスを参照します。なんで?
編集:Barに対してfirst.fooを2回印刷する際のエラーを修正しました。結果として生じる動作は、出力に見られるとおりです。