2017-05-01 26 views
0

私はAlgoSystemという名前のクラスで作業しています.AlgorSystemは、初期化の下で入力としてstrategy_0とstrategy_1と戦略の数(この例では2)を指定しています。戦略クラスは、AlgoSystem内の「戦略」と呼ばれる辞書に格納されます。 strategy_0とstrategy_1はどちらもの異なるクラスですが、両方とも "__on_tick"という関数があります。 AlgoSystemクラス内から呼び出したいこれらの関数。 これを行うには、私の現在の試みは、以下の見ている:私は上記のコードを実行すると別のクラスからクラス固有のメソッドを呼び出す

class AlgoSystem: 

    def __init__(self, strategy_0, strategy_1, numstrategies): 
     self.var= 1 
     self.strategies = {0 : strategy_0, 
          1 : strategy_1} 
     self.num_strategies = numstrategies 

    def start(self): 
     for i in range(self.num_strategies): 
      self.strategies[i].__on_tick(self.var) 

class Strategy_zero: 
    def __init__(self, x): 
     self.x = x 

    def __on_tick(self, var): 
     self.x = self.x + var 
     print(self.x) 

class Strategy_one: 
    def __init__(self, y): 
     self.y = y 

    def __on_tick(self, var): 
     self.y = self.y - var 
     print(self.y) 



strategy_0 = Strategy_zero(2) 
strategy_1 = Strategy_one(4) 

num_strategies = 2 

system = AlgoSystem(strategy_0, strategy_1, 2) 
system.start() 

は、私はエラーが与えられています:

​​

は、どうやら私はクラスの関数を呼び出していないよ「と__on_tick "適切に。私はこれをどのようにするべきですか?私はある意味でそれを行う必要があるので、私はAlgoSystem内で定義された辞書を使って2つのサブクラス(strategy_0とstrategy_1)の変更を追跡します: "戦略"。

答えて

3

接頭辞の二重の接頭辞は、あなたがやっていることを正確に行えないように特別に設計されています。

ここで使用する理由はありません。接頭辞を削除して、あなたの方法だけをon_tickにすることができます。

1

二重アンダースコアの名前は、隠された名前です(難読化によって隠されています)。あなたのon_tickメソッドをon_tickという名前にしてもう一度やり直すことをお勧めします。

0

次のコードは、名前のマングリングで起こっていることを明確にするのに役立ちます。

class A: 
    def __mangled(self): 
     print "Class A name-mangled method" 

class B: 
    def __init__(self): 
     a = A() 

     try: 
      a.__mangled() 
     except AttributeError: 
      # an attempt to access a name-mangled method assumes that 
      # the '_{class_name}' prefix should use 'B' as the class name 
      print "A instance has no attribute '_B__mangled'" 

     a._A__mangled() 
     # prints "Class A name-mangled method" 

     getattr(a, '_{}__mangled'.format(a.__class__.__name__))() 
     # same thing, but can be done without knowing the class name 

B() 

だから、あなたがするself.strategies[i].__on_tick(self.var)を更新できます。

strat = self.strategies[i] 
getattr(strat, '_{}__on_tick'.format(strat.__class__.__name__)(self.var) 

しかし、それはおそらく、/クラス外部からアクセスされることを意図しているので、二重下線で__on_tickの前ではないのがベストだろうインスタンス。

関連する問題