私は二重にリンクされたリストを実装する小さなツリークラスを書いています:
class node(object):
def __init__(self, level=0, pieces=0, parent=None,
root=None, childNo=None, avgN=2):
self.level = level # Current level in the tree. Zero = top.
self.pieces = pieces # Number of children. Can be constant or Poisson chosen random.
self.parent = parent # Parent of this node.
self.child = {} # Children of this node. Using a dictionary means
# the root could have direct access\
# to all children.
self.childrenID = {}
self.myID = childNo # This node's index in the parents self.child list.
if (root == None): # If I'm the root, then hey, I'm the root!
self.root = self
else:
self.root = root
self.avgN = avgN
self.numOfChildren = 0
self.pieces = self.avgN
def print_all_data(self):
print "Printing all data for node:",self.myID
obj_attr = [a for a in dir(n) if not a.startswith('__') and not callable(getattr(n,a))]
for ob in obj_attr:
print ob, getattr(n,ob)
return
# This function acutally adds a child node to this parent.
def add_child_node(self, childno):
self.numOfChildren += 1
if (self.numOfChildren > self.pieces):
print "Error: number of children exceeds the number of assigned pieces"
print " for node:", self.myID
childno = self.compute_new_child_ID(self.level, self.numOfChildren)
self.childrenID[self.numOfChildren] = childno
self.child[childno] = self.get_new_node(childno)
return
def get_new_node(self,childno):
return node(level=self.level+1, parent=self,
root=self.root, childNo=childno,
avgN=self.avgN)
def compute_new_child_ID(self, level, childno):
return (level+1)*100 + childno
def get_child_no_from_child_ID(self, level, childID):
return childID - (level+1)*100
一部の機能は重複しているように見えますが、これらは将来使用するためのプレースホルダーであることに注意してください。
インスタンスを作成すると、次のようになります。
n = node()
n.print_all_data()
Printing all data for node: None
avgN 2
child {}
childrenID {}
level 0
myID None
numOfChildren 0
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>
ただし、子を追加すると、親のプロパティが子に組み込まれます。
n.add_child_node(0)
n.add_child_node(1)
n.print_all_data()
Printing all data for node: None
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>
子データは次のとおりです。
n.child[101].print_all_data()
Printing all data for node: 101
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>
また、新しいノードを作成すると、この古いインスタンスデータが継承されます。
n2 = node()
n2.print_all_data()
Printing all data for node: None
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>
これで、StackOverflow全体を検索しましたが、init(これらはインスタンス属性です)の使用に失敗したり、関数定義で不変の辞書を不適切に初期化したりしていません(ここでさらに説明します)。SOには、自分の問題に一致する他の例が見つからなかったため、新しい質問が見つかりました。どんな援助も大歓迎です。
インスタンスは正しいです、あなたは間違ったデータを印刷しているだけです。
このメソッドprint_all_data
では、現在のインスタンスの属性を出力する代わりに、変数によって参照されるインスタンスのn
属性を常に出力します(これは、より高いスコープから継承され、使用されているインスタンスに関係なく、常に「ルート」ノードを参照します)。 (self
参照)。
メソッドではprint_all_data
、次のようなものが必要です(現在のインスタンスは変数によって参照されますself
):
obj_attr = [a for a in dir(self)
if not a.startswith('__') and not callable(getattr(self, a))]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加