Python では、変数名 ( などself
) は値を「指す」または「参照する」と考えてください。のインスタンスを作成するとB
:
b = B(2)
B.__init__
メソッドは、 の inchoate インスタンスに既に割り当てられている変数で呼び出されself
ますB
。さて、このメソッド内で、Python が
self = A(x)
変数self
は の新しいインスタンスに再割り当てされますA
。のインスタンスはB
まだ存在します。self
もはやそれを指していません。
self
は、Python の他の変数と同様に変数であることに注意してください。(self
はキーワードではありません。メソッドの最初の引数が呼び出されるのは単なる慣習ですself
。)
ちなみに、self
の値で初期化するにはx
、
class B(A):
def __init__(self,x):
A.__init__(self, x) # <-- Note the x
print "constructing B"
self.printx()
それで
b = B(2)
b.printx()
収量
constructing A
constructing B
x = 2
x = 2
クラスに などの代替コンストラクターがある場合、getA
Python の典型的なパターンはクラスメソッドを使用することです。
class A(object):
def __init__(self, x=0):
print "constructing A"
self.x = x
def printx(self):
print "x =",self.x
@classmethod
def getA(cls, x):
print('constructing getA')
self = cls(x)
self.y = 1
return self
A
classmethodでのインスタンスを作成するには、次のようにしgetA
ます。
a = A.getA(x)
クラスA
は、classmethod の最初の引数として渡されgetA
、変数に格納されますcls
。
(ファクトリ関数を使用する代わりに)この方法で行うことの美しい点getA
は、次のようにサブクラス化する場合ですA
。
class B(A):
def __init__(self,x):
A.__init__(self, x)
print "constructing B"
self.printx()
次に、 classmethodをB
使用してインスタンスを作成することもできます。getA
b = B.getA(2)
収量
constructing getA
constructing A
constructing B
x = 2
と
print(type(b))
print(b.y)
収量
<class '__main__.B'> # b is an instance of B
1 # showing the y attribute has been set.