2017-01-13 8 views
2

と呼ばれていることを確認することができます:は、私は次のように私はPythonの抽象基本クラスを持っているPythonの基底クラスのメソッドは、常に

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()を呼び出す必要があります。これは大きな問題ではありませんが、好奇心のために、子オブジェクトのrunを実行する前にbind_inputが呼び出された基底クラス自体から何らかの形でこれを保証することは可能ですか?

+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 

は、あなたのサブクラスではなく、外側1の内部メソッドを、オーバーライドしてもらいます。

+0

なぜメタクラスについて話しているのか分かりません。質問者がこれを解決するためにメタクラスを書くことを考えていることを示唆することは何の質問にもありません。 (彼らはABCMetaメタクラスを使用していますが、抽象基本クラスには必須です) – user2357112

+0

True!不必要なテキストを削除しました – slezica

+0

これはすばらしいです。私は恥じている、私はこれを考えなかった。ありがとう。 – Luca

関連する問題