1

私はで継承を扱っていましたWTForms。次のクラスがありました:

class MyForm(WTForms):
    ...
    def process(self, formdata=formdata, obj=None):
        super(self.__class__, self).process(formdata=formdata, obj=obj)

そして、私はエラーがありました(常にではありませんが、場合によっては同様の形式で-それはさらに奇妙です):

Maximum recursion depth have been exceeded

しかし、私が変わったときself.__class__MyFormすべてが大丈夫でした!

わかりません...私が知っているように、それらは同義語でなければなりません。どうしたの?

4

1 に答える 1

6

それらは同義語ではありません。から継承selfするクラスの任意のオブジェクトである可能性があります。Pythonは、継承されたメソッドを呼び出すための新しいスーパークラスオブジェクトをサイレントに作成するのではなく、同じオブジェクトを渡すだけです(そうすると、ポリモーフィズムが壊れて役に立たなくなります)。そして、/は明らかにオブジェクトが実際にインスタンスであるクラスであり、そのスーパークラスではありません(あなたは譲歩することを期待していませんよね?)。どこからアクセスするかによって変更すると、本当に驚くべき、慣用的ではなく、役に立たないでしょう。それはただのポリモーフィズムです。 MyFormtype().__class__MyShinyThing().__class__object__class__

そして、への最初の引数superは、MROでスーパーメソッドの検索を続行する必要がある場所(非公式:現在の場所)であるため、パスは常に、インスタンスであるself.__class__クラスの(即時の)スーパークラスから始まります。selfクラス階層の他の場所で適切なsuper呼び出しを行うと、最終的にはに戻りMyForm.process、無限ループが発生します。

于 2012-04-08T08:42:49.413 に答える