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
クラスに などの代替コンストラクターがある場合、getAPython の典型的なパターンはクラスメソッドを使用することです。
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
Aclassmethodでのインスタンスを作成するには、次のようにし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.