0

Python (2.7) の継承に問題があります。派生クラスから親へ、またその逆を参照しようとしています。これは、クラスをハードコーディングすれば十分簡単ですが、私には醜いアプローチのように思えます。それは...ですか?とにかく、ここに行きます:

class Alpha(object):
    def fie(self):
        pass

class Beta(Alpha):
    def fie(self):
        super(self.__class__, self).fie()

class Gamma(Beta):
    pass

Alpha().fie()
Beta().fie()
Gamma().fie()

最後のものはfieで定義されているように呼び出しますBetaが、 から呼び出されるためGamma、 はsuperを参照しBetaます。そのため、再び自分自身を呼び出し、無限再帰を開始します。

関数が最初に定義されたクラスを参照する方法はありますか? または、チェーンの最上位のクラス (以外object)? それとも、クラス名をハードコーディングせずにこれを達成するためのさらに良い方法でしょうか?

4

1 に答える 1

4

いいえ-次のように書くだけです:

class Beta(Alpha):
    def fie(self):
        super(Beta, self).fie()

参照: http://yergler.net/blog/2011/07/04/super-self/ - そこから引用 (私よりもよく説明されているので!):

Python 2.7.2 標準ライブラリのドキュメントによると、super は「メソッド呼び出しを型の親または兄弟クラスに委譲するプロキシ オブジェクトを返します」。したがって、単一継承の場合は、アクセスをスーパー クラスに委譲し、スーパー クラスのインスタンスを返しません。上記の例では、これは、B をインスタンス化すると、次のことが起こることを意味します。

enter B.__init__()
call super on B and call __init__ on the proxy object
enter A.__init__()
call super on self.__class__ and call __init__ on the proxy object

問題は、ステップ 4 に到達したときに、self がまだ B のインスタンスを参照しているため、super ポイントを再度 A に呼び出すことです。専門用語で言えば、Ka-bloom です。

また、その記事には Raymond Hettinger によるブログへのリンクがあります (常に読む価値があります): http://rhettinger.wordpress.com/2011/05/26/super-considered-super/

注意: ユーザーが使用を提案しているコメントtype(self)(equiv to your self._ class _) と、それが機能しない理由を読んでください。

于 2012-12-23T20:03:57.943 に答える