14

次のモデルと抽象基本クラスがあります

import abc
from django.db import models


class AbstractBase():
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def my_method(self):
        return


class MyModel(models.Model, AbstractBase):
    @abc.abstractmethod
    def my_method(self):
        return 1

しかし、次のエラーが発生します。

メタクラスの競合: 派生クラスのメタクラスは、そのすべてのベースのメタクラスの (厳密ではない) サブクラスでなければなりません

ここでの問題は、(ここで説明されているようにhttp://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/ ) 2 つの基本クラスに 2 つの異なるメタクラスがあるため、Python がどのメタクラスを使用するかを決定できないことだと思います子オブジェクトに使用します。

これを解決するために、多重継承を削除し、次の register メソッドを使用して子クラスを登録しました

abc.register(Child)

しかし、私はこのアプローチがあまり好きではありませんでした。モンキー パッチのように見えるからです。

この問題を解決する別の方法はありますか?

Model メタクラスを Child に明示的に割り当てようとしましたが、うまくいきませんでした。コードを書くことで解決する方法を探しているわけではありません。これは、クラス構造を変更することで解決する必要があると思います。

4

1 に答える 1

2

ABCMetaと の両方を継承する新しいメタクラスを作成する以外にModelBaseまたはABCMetaから継承させるModelBaseあなたができることはあまりありません。

ただし、おそらく別の登録パターンが適切である可能性がありますか?多分何かのようなcontrib.admin.autodiscoverそれともクラスデコレーター?または、適切なクラス (例).pyを呼び出すファイルの下部にあるループですか?registerfor var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var)

編集:D'oh。ABCMetaではなく、例だと思っていましたABCMeta。それは、睡眠が少なすぎるときに StackOverflow をブラウジングすることで得られるものです。

于 2012-01-04T08:26:33.017 に答える