#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
метод делает вещи более запутанными, еще раз спасибо 🙂