2017-01-13 2 views
2

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

class Node(object): 
    """ 
    All concrete node classes should inherit from this 
    """ 
    __metaclass__ = ABCMeta 

    def __init__(self, name): 
     self.name = name 
     self.inputs = dict() 

    def add_input(self, key, value=None, d=None): 
     self.inputs[key] = (d, value) 

    def bind_input(self): 
     print "Binding inputs" 

    @abstractmethod 
    def run(self): 
     pass 

Теперь, различные производные классы наследуют от этого класса узла и переопределить метод run. Всегда бывает, что bind_input() должно быть первым, что нужно вызвать в методе run. В настоящее время для всех производных классов разработчик должен сначала позвонить self.bind_input(). Это не огромная проблема как таковая, но из любопытства можно ли это как-то сделать из самого базового класса, который вызывается bind_input перед выполнением дочернего объекта run?

+0

Должен ли быть метод абстрактным? 'def run (self): self.bind_input()' Тогда все подклассы сначала назовут base.run(), что является более интуитивным стандартом. – GantTheWanderer

+0

Да, поскольку все дочерние классы должны иметь специфическую реализацию класса 'run'. – Luca

ответ

4

Обычный объектно-ориентированный подход заключается в следующем:

def run(self): 
    self.bind_input() 
    return self.do_run() 

@abstractmethod 
def do_run(self): 
    pass # override this method 

Пусть ваши подклассов переопределить внутренний метод, вместо внешней.

+0

Я не уверен, почему вы так много говорите о метаклассах. В этом вопросе нет ничего, что могло бы предположить, что вопросник думал о написании метакласса, чтобы решить эту проблему. (Хотя они используют метакласс ABCMeta, это является обязательным для абстрактного базового класса.) – user2357112

+0

True! Удален ненужный текст – slezica

+0

Это потрясающе. Мне стыдно, что я не думал об этом. Благодарю. – Luca

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