2016-03-30 5 views
1
class car(object): 
    def read_spec_and_populate_db(): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

class awd(car): 
    super(awd, self).read_spec_and_populate_db() 

    def foo(self): 
    ... 

class fwd(car): 
    super(fwd, self).read_spec_and_populate_db() 

    def bar(self): 
    ... 

クラスawdfwdは異なる時間にインスタンス化または片方のみのインスタンス化することができますすることができます。今、基本クラスのメソッドread_spec_and_populate_db()を1回だけ実行するように制限する方法はありますか?一度だけ実行されるように、基本クラスのメソッドを制限する方法

私はSOで検索して、hereを見つけました。他のオプションがあるかどうかを確認したい

編集:私はそれに反対です。私はフラグを使用する以外にもアイデアを探しています。私の現在の実装では、クラス内のフラグを使用しています。

答えて

2

だけフラグを使用する:あなたが望む として

class car(object): 
    db_read = False 
    def read_spec_and_populate_db(): 
     if not car.db_read: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      car.db_read = True 

今、あなたはread_spec_and_populate_db()何度でも呼び出すことができます。それはその仕事を一度しか行いません。

+0

としません:あなたは、いくつかの方法を「それが読み込まれた」を追跡する必要があります、そしてフラグが完全に透明な方法でありますそれを正確に伝える。魔法のためだけに魔法のことをしないでください。 – MatsLindh

+0

クラスメソッドがより洗練されたIMOであることを除いて、これは問題ありません。はいの場合は、あなたの答えを更新し、私は私を削除します。私はすでにあなたをアップヴォートしました –

+0

classmethodは継承では動作しません。最初に 'awk'のインスタンスを作成すると' awk.populated = True'が作成されます。そして、あなたが 'car'のインスタンスを作るとき、' car.populated'はまだfalseであり、スペックはもう一度読み込まれます。 –

0

あなたはそうのように、この方法は、すでにか実行されているかどうかを追跡するためにブールクラス属性フラグを使用することができます。

class Car(object): 
    _populated_db = False 

    def read_spec_and_populate_db(self): 
     if not self._populated_db: 
      spec = read_from_file(spec.yaml) 
      populate_db(spec) 
      self._populated_db = True 
+0

ちょうど興味のない、あなたはそれのためにdownvoteでしたか? – s16h

+0

はい、私は同じ答えを2回持っているという点は見ません。 –

-1

一つの考えはの最後のステップとして、名前read_spec_and_populate_dbを再割り当てされる可能性があります同じシグネチャを持つメソッドを指すようにその実行が、説明するためには何も

class car(object): 
    def _dummy(self): 
     pass 

    def read_spec_and_populate_db(self): 
     spec = read_from_file(spec.yaml) 
     populate_db(spec) 

     self.read_spec_and_populate_db = self._dummy 
関連する問題