2016-12-23 1 views
0

У меня есть 2 класса, которые я хочу как наследовать из другого класса. Эти 2 класса уже имеют , определенные. Теперь я хочу, чтобы эти 2 класса наследовали метод, требующий ряд параметров (аргументов). Но в 2 классах, которые должны унаследовать, получает преимущество.Наследование: __init__ overriden

Как я могу решить эту проблему? Я читал о конструкторах в Python против . Могу ли я создать пользовательский конструктор для метода? Я совершенно новый на занятиях вообще.

EDIT:

Вот что я attemping. Это проект GUI. Это основной класс:

class Error: 
    def __init__(self, check0, check1, check2, check3, check4, check5, check6, check7, check8, check9, check10, check11, 
        check12, check13, check14, check15): 
     self.check0 = check0 
     self.check1 = check1 
     self.check2 = check2 
     self.check3 = check3 
     self.check4 = check4 
     self.check5 = check5 
     self.check6 = check6 
     self.check7 = check7 
     self.check8 = check8 
     self.check9 = check9 
     self.check10 = check10 
     self.check11 = check11 
     self.check12 = check12 
     self.check13 = check13 
     self.check14 = check14 
     self.check15 = check15 

    def feedbackOnError(self): 
     feedback = '' 
     global feedback 

     if self.check0 == False: 
      feedback0 = "You didn't provide a name and/or mail" 
      feedback = feedback0 

     if self.check3 == False: 
      feedback3 = "You didn't provide a valid year (you used over 4 digits or none)" 
      feedback = feedback3 

     if self.check4 == False: 
      feedback4 = "You didn't provide a valid year (you used letters)" 
      feedback = feedback4 

     if self.check5 == False: 
      feedback5 = "You didn't provide a valid month (you used over 2 digits or none)" 
      feedback = feedback5 

     if self.check6 == False: 
      feedback6 = "You didn't provide a valid month (you used letters)" 
      feedback = feedback6 

     if self.check7 == False: 
      feedback7 = "You didn't provide a valid month (you used a number above 12)" 
      feedback = feedback7 

     if self.check8 == False: 
      feedback8 = "You didn't provide a valid month '00' is not a month)" 
      feedback = feedback8 

     if self.check9 == False: 
      feedback9 = "You didn't provide a valid day (you used letters)" 
      feedback = feedback9 

     if self.check10 == False: 
      feedback10 = "You didn't provide a valid day '00' is not a day)" 
      feedback = feedback10 

     if self.check11 == False: 
      feedback11 = "You didn't provide a valid day (you used a number above 31)" 
      feedback = feedback11 

     if self.check12 == False: 
      feedback12 = "You didn't provide a valid day (you used over 2 digits or none)" 
      feedback = feedback12 

     if self.check13 == False: 
      feedback13 = "Your month doesn't match up with your day (February has 29 during leap year)" 
      feedback = feedback13 

     if self.check14 == False: 
      feedback14 = "Your month doesn't match up with your day (February has 28 during normal years)" 
      feedback = feedback14 

     if self.check15 == False: 
      feedback15 = "Your chosen month and day don't match up (You used '31' for a month with only 30)" 
      feedback = feedback15 

     if self.check1 == False: 
      feedback1 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback1 

     if self.check2 == False: 
      feedback2 = "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :" 
      feedback = feedback2 

Это классы, которые я хочу, чтобы наследовать главный класс:

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(AddDialog, self).__init__(*args, **kwargs) 


class EditDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, *args, **kwargs): 
     super(EditDialog, self).__init__(*args, **kwargs) 
+3

Вам нужно будет показать нам свой код, если мы хотим указать, что вы сделали неправильно. – user2357112

+0

Попробуйте вызвать 'super' в методах' __init__'. – bjd2385

+1

Непонятно, как '__init__' связано с вашей проблемой« наследовать метод »... или т. Е. Проблема IS. –

ответ

0

Проблема, кажется, что вы только выполнение одного из двух базового класса __init__ методы, которые у вас есть, но вы хотите передать аргументы и вызвать оба.

super будет только метод, который появляется первым в порядке разрешения метода (MRO), поэтому вам придется вызвать по крайней мере один из __init__ s «вручную». Вам также придется решить, какие аргументы для производного __init__ идти туда, где вам нужно будет пройти в обоих наборах аргументов. Ради этого примера, я буду делать вид, что ошибка принимает только три необходимые позиционные аргументы (check0, check1 и check2):

class AddDialog(sized_controls.SizedDialog, Error): 
    def __init__(self, check0, check1, check2, *args, **kwargs): 
     Error.__init__(self, check0, check1, check2) 
     SizedDialog.__init__(self, *args, **kwargs) 

На соответствующую записку, я рекомендовал бы, чтобы вы реорганизовывать код, чтобы использовать список потому что честно, 16 аргументов смехотворны. Использование *args, вы можете избежать рефакторинга слишком много дополнительного кода:

class Error: 
    feedback_strings = [ 
     "You didn't provide a name and/or mail", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You used characters that are not permitted: \n/' * \\ _ > < [ ] () | + { } % & ! \" # = ?^~ . , ; :", 
     "You didn't provide a valid year (you used over 4 digits or none)", 
     "You didn't provide a valid year (you used letters)", 
     # You get the idea... 
    ] 

    def __init__(self, *checks): 
     if len(checks) != 16: 
      raise ValueError('16 positional arguments are required') 
     self.checks = [bool(x) for x in checks] 

    def feedbackOnError(self): 
     for index, check in enumerate(self.checks): 
      if not check: 
       return self.feedback_strings[index] 

Этот код примерно в 10 раз меньше, легче поддерживать и легче читать, чем существующий код. Я также рекомендую вернуть значение из вашей функции обратной связи вместо установки глобальной переменной. Глобальный подход к переменной - это действительно плохая идея, потому что вы действительно не знаете, кто ее будет модифицировать.

+0

@andrew. A) Ожидание убивает меня. Б). Как вы думаете, что делает «супер ...»? –

+0

Это откровенно плохой дизайн. Правильное использование 'super()' является [цепочкой ответственности] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/). В общем случае для класса не может быть известно обо всех классах, которые появляются после него в порядке разрешения метода (по крайней мере, не обойтись без рутинной интроспекции этой информации во время выполнения, что является массовым переполнением стандартного метода инициализации). Таким образом, это не будет работать в общем случае и должно быть обескуражено. – Kevin

+0

@Kevin. Я не мог согласиться с тобой больше. Однако это то, о чем попросил ОП в самом прямом прямом смысле. –

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

  • Нет связанных вопросов^_^