2012-02-16 3 views
0

Почему этот код не работает? Я вижу в отладчике (PyCharm), что init выполняется строка, но не более того. Я постарался поставить исключение, чтобы быть уверенным, и снова ничего не случилось.Наследование множественности и форма Django

class polo(object): 
    def __init__(self): 
     super(polo, self).__init__() 
     self.po=1  <- this code is newer executed 

class EprForm(forms.ModelForm, polo): 
    class Meta: 
     model = models.Epr 
+0

Почему это не работает? Какие ошибки и т. Д. Вы получаете? – Marcin

+0

Абсолютно никаких ошибок. Код просто не выполняется. – user1214179

ответ

1

используется multiple inheritance так вообще Python будет искать методы в слева-направо. Так что если ваш класс не имеет __init__, он будет искать его в ModelForm и что (только если не найден) в polo. В вашем коде polo.__init__ никогда не вызывается, потому что вызывается ModelForm.__init__.

Для вызова конструкторов обеих базовых классов используют явный вызов конструктора:

class EprForm(forms.ModelForm, polo): 

    def __init__(self, *args, **kwargs) 
     forms.ModelForm.__init__(self, *args, **kwargs) # Call the constructor of ModelForm 
     polo.__init__(self, *args, **kwargs) # Call the constructor of polo 

    class Meta: 
     model = models.Epr 
+0

Большое спасибо. Теперь это логично, когда я вижу ваш ответ. Я не знаю, почему предполагается, что __init__ - это особый метод и будет вызван для каждого унаследованного класса. И со знанием из http://stackoverflow.com/questions/1401661/python-list-all-base-classes-in-a-hairsfiles Я могу вызвать функции __init__ всех базовых классов. Отличная работа! – user1214179

Смежные вопросы