Использование перегруженного метода в родительском классе

#python #inheritance #polymorphism

#python #наследование #полиморфизм

Вопрос:

Рассмотрим следующий код:

 class iterative_solver:

   def stop_condition(self):
   #To be specified in the child classes

   def solver(self):
      while stop_condition:                   #Error
         print("In the cycle")

class specific_solver(iterative_solver):

   def stop_condition(self,num):
      return num>0

  

Когда я определяю метод stop_condition , я еще не знаю, какие аргументы он может принять, я оставляю конкретную реализацию метода в дочернем классе specific_solver .

Как я могу использовать внутри родительского класса метод, указанный в дочернем классе, для которого я еще не знаю аргументов?

Комментарии:

1. Как solver должен работать этот метод? В нем нет ничего, что могло бы изменить результат условия.

2. Вам нужно определить интерфейс для stop_condition() и использовать его в solver() методе. Его можно сделать довольно общим, используя аргументы переменной длины *args и *kwargs .

3. Есть ли у вас конкретный способ сделать это, который отличается от ответа, который уже был дан? Я изучаю программирование на Python и ООП, поэтому у меня совсем нет опыта

4. Возможно, более практичный пример того, что вы хотите сделать, даст другие ответы. В настоящее время ваш вопрос довольно абстрактный.

Ответ №1:

Решение

Используйте *args и **kwargs , чтобы разрешить передачу произвольных аргументов и аргументов ключевого слова.

Пример

 class IterativeSolver(object):

   def stop_condition(self):
       raise NotImplementedError # Use this to indicate that subclass must override the method.

   def solver(self, *args, **kwargs):
      while stop_condition(*args, **kwargs):
         print("In the cycle")

class SpecificSolver(IterativeSolver):

   def stop_condition(self, num):
      return num>0

num = 1
SpecificSolver.solver(num)
  

Комментарии:

1. Спасибо, я понял идею. Однако есть несколько проблем: (1) код не запускается, не могли бы вы опубликовать работоспособную версию? (2) предположим, что теперь у stop_condition1 меня есть и stop_condition2 , что дочерние классы могут переопределяться и что я хочу использовать solver . Есть ли хороший способ различать, какие части *args входят в какие stop_condition (1 или 2)? Я думаю, что ввод каждого ввода в solver метод делает вещи более запутанными, еще раз спасибо 🙂