0

基本クラス A と派生クラス B の 2 つのクラスがあります。BI のコンストラクターで、A のコンストラクターを使用してインスタンスを初期化しようとしました。派生クラスのコンストラクターでの割り当て "self = A(x)" が機能しないのはなぜですか?

class A:
    def __init__(self, x=0):
        print "constructing A"
        self.x = x

    def printx(self):
        print "x =",self.x 

class B(A):
    def __init__(self,x):
        A.__init__(self)
        print "constructing B"
        self = A(x)
        self.printx()


b = B(2)
b.printx()

出力:

constructing A
constructing B
constructing A
x = 2
x = 0
4

2 に答える 2

2

でコンストラクターを呼び出したくないので、にB.__init__渡す必要がありxますA.__init__

class A:
    def __init__(self, x=0):
        print "constructing A"
        self.x = x
    def printx(self):
        print "x =",self.x 

class B(A):
    def __init__(self,x):
        A.__init__(self, x)
        print "constructing B"
        self.printx()
于 2012-11-21T21:59:45.033 に答える
1

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.
于 2012-11-21T21:57:07.863 に答える