簡體   English   中英

將abc子類化的django模型會產生元類沖突

[英]A django model that subclasses an abc, gives a metaclass conflict

我有一個以下模型和抽象基類

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/ )兩個基類有兩個不同的元類,所以python無法決定哪個元類到用於子對象。

為了解決這個問題,我刪除了多個繼承並使用以下寄存器方法來注冊子類

abc.register(Child)

但我真的不喜歡這種方法,因為它看起來像猴子修補。

有沒有其他方法可以解決這個問題?

我嘗試明確地將模型元類分配給Child,但它不起作用。 我不是在尋找通過編寫代碼來解決它的方法。 我認為這必須通過改變我的類結構來解決。

除了建立一個新的元類是來自繼承ABCMetaModelBase 或使ABCMeta繼承ModelBase 你無能為力。

但是,可能有不同的注冊模式可能是合適的嗎? 也許像contrib.admin.autodiscover 還是班級裝飾師? .py文件底部的循環,它調用相應類的register (例如, for var in globals().values(): if isinstance(var, type) and issubclass(var, AbastractBase): register(var) )?

編輯 :D'哦。 我認為ABCMeta就是一個例子,而不是ABCMeta 這就是我在太少睡眠時瀏覽StackOverflow所得到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM