2017-02-09 9 views
0

私は、多重リンクされたリストを作成するクラスを持っています。各ノードは、複数の(または1つまたは複数の)子を持つことができます。ノードには最新の子ノードへのポインタがあり、各子ノードには前の兄弟ノードへのポインタがあります。だから、私は最新の子どもそれぞれを兄弟姉妹の順番に服用してツリー全体を歩くことができます。この関数が正常に3を歩くが、何も有効ではありません。リンクされたオブジェクトのリストを介して関数を渡す

def walk_the_tree(self): 
    if not self.latestChild is None: 
     self.latestChild.walk_the_tree() 
    if not self.sib is None: 
     self.sib.walk_the_tree() 

、私が本当にやりたいことは、メンバ関数は、各ノードで実行できるように、引数のいくつかの種類を渡すことです。ここではコンパイルされません何かが、私は私が望んでいたものとそれを取得願っています:

def walk_the_tree(self, fcn): 
    self.fcn() 
    if not self.latestChild is None: 
     self.latestChild.walk_the_tree() 
    if not self.sib is None: 
     self.sib.walk_the_tree() 

をので、FCNは、例えば、単にクラス__repr__可能性があり、私はすべてのノード上のすべての情報を得ることができます早く。または、ノードが新しい子を必要とするかどうかを判断し、新しい子を必要とするかどうかを判断する(create_new_child())場合もあります。私は、ユーザーが何らかのフラグに頼ることなくこれを選択できるようにしたいと思います。

def walk_the_tree(self, fcnflg): 
    if (fcnflg == 1): self.__repr__() 
    if (fcnflg == 2): self.create_new_child() 
    if not self.latestChild is None: 
     self.latestChild.walk_the_tree() 
    if not self.sib is None: 
     self.sib.walk_the_tree() 

これを行うにはどのような方法:たとえば、私が望んでいないは何かに似ていますか?

+0

機能は、ファーストクラスのオブジェクトです。だから、ちょうどうまくいくはずですそれが定義されないので 'self.fnc'をしないでください。 –

+0

OOPの習慣としては間違いなくにおいがしますが、 'obj.walk_the_tree(obj.create_new_child)'はあなたが探しているものです – BlackBear

+0

ええと、モジュールレベルの機能にするだけです。 'def walk_tree(tree、f)'です。私はクラスを簡潔に保つことはかなり根気よく、これは間違いなく方法かもしれません。 –

答えて

1

self.fcnを使用していますが、定義されていないという問題があります。ちょうどfcnを使用してください。ここでは不自然な例です:

>>> class MyContainer(object): 
...  def __init__(self, iterable=None): 
...   if iterable is not None: 
...    self.data = list(iterable) 
...   else: 
...    self.data = [] 
...  def walk_container(self, f): 
...   for x in self.data: 
...    print(f(x)) 
...  def _increment(self, x): 
...   return x + 1 
...  def print_increments(self): 
...   self.walk_container(self._increment) 
... 
>>> c = MyContainer([0,1,2]) 
>>> c.print_increments() 
1 
2 
3 
>>> 

それともたい場合は、外部から非メソッドを使用します。

>>> c.walk_container(lambda x: x**2) 
0 
1 
4 
>>> 
関連する問題