을 제공합니다 내가 가지고 다음과 같은 모델과 추상 기본 클래스장고 모델은 메타 클래스 충돌
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/) 두 개의 기본 클래스에는 두 개의 다른 메타 클래스가 있으므로 파이썬은 자식 객체에 사용할 메타 클래스를 결정할 수 없습니다.
는이 문제를 해결하기 위해 나는 자식 클래스에게abc.register(Child)
를 등록하는 등록 방법에 따라 여러 상속 및 사용을 제거하지만 나는 원숭이 패치처럼 보이는 때문에이 방법처럼 정말하지 않았다.
이 문제를 해결할 다른 방법이 있습니까?
Model 메타 클래스를 명시 적으로 Child에 할당하려고 시도했지만 작동하지 않았습니다. 코드를 작성하여 문제를 해결할 방법을 찾고 있지 않습니다. 나는 이것이 나의 계급 구조를 변화시킴으로써 해결되어야한다고 생각한다.
장고와 abc의 작업을 모두 수행하는 새 메타 클래스를 생성해야 할 것입니다. 아마 각각의 메타 클래스를 순서대로 호출하거나, 상속을 사용하여 호출 할 수 있습니다. – cha0site
abs.register 메서드를 사용하는 것에 대해 아무런 해킹도 없습니다.이 경우 정확하게 설계되었습니다. BTW, 파이썬 방식으로 생각하는 일들이 이루어지기 때문에 인터페이스와 같은 것들을 거의 필요로하지 않습니다. 아마도 정적 언어로 작업하는 방식에 너무 제약을받을 것입니다. – jsbueno
@jsbueno - 당신 말이 맞겠지 만 인터페이스 기능을 어떤 식 으로든 구현해야 할 것입니다. 다음은 이식의 예입니다 (https://gist.github.com/1559689). 파이썬에서이 기능을 구현하는 더 좋은 방법이 있습니까? – yilmazhuseyin