verir I have a aşağıdaki modeli ve soyut temel sınıfbir Django modeli, bir metaclass çatışmayı
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
Ama aşağıdaki hatayı alıyorum.
metaclass çatışma: Bir türetilmiş sınıfın metaclass tüm üsleri metaclasses bir (non-sıkı) alt sınıf olmalıdır
Ben burada açıklanan gibi Buradaki sorun (olduğunu düşünüyorum http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/) iki temel sınıfın iki farklı metasınıfı olduğundan, python alt nesne için hangi metaclassın kullanılacağına karar veremez.
bu çözmek için ben çocuk sınıfabc.register(Child)
kayıt kayıt yöntemiyle aşağıdaki çoklu kalıtım ve kullanımını kaldırıldı Ama maymun yama gibi görünüyor çünkü bu yaklaşım gerçekten sevmedim.
Bu sorunu çözmenin başka bir yolu var mı?
Model metaclass'ı açık bir şekilde Çocuk'a atayım ancak işe yaramadı. Kod yazarak çözmek için bir yol arıyorum. Bunun, sınıf yapılarımı değiştirerek çözülmesi gerektiğini düşünüyorum.
Sanırım hem django hem de abc'nin şeylerini yapan yeni bir metaclass oluşturmak zorunda kalacaksınız, muhtemelen kendi meta sınıflarını sırayla, belki miras kullanarak arayacaksınız. – cha0site
abs.register yöntemini kullanma konusunda hiçbir şey yoktur - bu durumlar için tam olarak tasarlanmıştır. BTW, Python yolu o şeyler düşünülür, bu yüzden nadiren _need_ arayüzleri ve böyle şeyler yapmalısınız - belki de işlerin statik dilde yapılmasıyla çok kısıtlısınızdır? – jsbueno
@jsbueno - Haklı olabilirsiniz, ancak bir şekilde arayüz işlevselliğini uygulamanız gerekecek. İşte bir örnek implantasyon - https://gist.github.com/1559689. Bu işlevselliği python'da uygulamak için daha iyi bir yolu var mı? – yilmazhuseyin