0

こんにちは、継承された子クラスから基本クラスのインスタンス名を取得したいと考えています。

例のために。

class Foo():
    def __init__(self, fakeArg):
        self.a = fakeArg

class Bar(Foo):
    def __init__(self, fakeArg1):
        Foo.__init__(self)
        self.b = fakeArg1
        # say, i store parent(Foo) instance in an variable too
        self.c = f

f = Foo('Hello')
b = Bar('Bar')

ここで、"f" を "b" にアタッチ (関連付け) して、クラス Bar を b としてインスタンス化する場合、派生クラス インスタンスを呼び出している親クラスのインスタンスも格納する必要があります。

これを行う 1 つの方法は、親クラス (Foo) のインスタンス "f" をクラス (Bar) の " _ init _ " メソッドへの引数として解析することです。しかし、これは一種のハックです。

問題の解決策を教えてください。

前もって感謝します。

4

2 に答える 2

2

あなたにとってハックのように聞こえるのは、それをどのように行うべきかということです。

各クラスには大量のインスタンスが存在する可能性があるため、どのクラスがそれに「関連」していると想定されているかを自動的に認識できないFooことに注意してください。それが唯一のものであることを願っています)は非常に醜く、私があなたの上司だったらあなたの顔を激しく叩く理由になります.

したがって、引数として に渡す必要があります。fBar()

別のFooインスタンスが必要ない場合 (つまり、通常の継承が必要な場合) のインスタンスを作成する必要はありません。コンストラクターでorをFoo呼び出すだけで、値をハードコーディングする代わりに引数として受け入れることができます。Foo.__init__(self, 'Hello')super(Bar, self).__init__('Hello')Bar

于 2012-10-15T12:09:12.103 に答える
2

Python で継承がどのように機能するかについて混乱しているようです。あなたが示したコードでは、互いにすぐ隣にインスタンス化されることを除いて、関連していませんfb

ただし、Barインスタンスはインスタンス、つまりそれ自体にbアクセスできます。それが のサブクラスであるとFoo宣言することで、 のすべてのインスタンスが のインスタンスでもあると言っています。でこれをテストできます。BarFooBarFooisinstance(b, Foo)

Fooのメソッドから で定義された変数またはメソッドにアクセスする必要がある場合は、通常、渡さbarれた値で直接アクセスできます。selfまたは、メソッドをオーバーライドしている場合Bar(つまり、既に存在するメソッドと同じ名前のメソッドを定義している場合は、Foo次を使用できますsuper

class Foo:
    def __init__(self, a):
        self.a = a

    def sayHello(self):
        print("Hello!")

class Bar(Foo):
    def __init__(self, a, b):
        super().__init__(self, a)  # calls overridden __init__ method from Foo
        self.b = b

    def doSomething(self):
        self.sayHello()            # calls a method defined in Foo
        return self.a + self.b     # accesses variable "a" that was set in Foo

(上記のコードは Python 3 用であることに注意してください。Python 2 では正しく動作しない小さな問題がいくつかあります。レガシー Python 2 アプリケーションを維持する以外の理由で Python を学習している場合は、Python 3 で学習することをお勧めします。 .)

于 2012-10-15T13:02:14.663 に答える