<div dir="ltr">Hi all, I am trying to get a suffix tree from a string. I use three classes, Node, Edge, SuffixTree. I have two questions when implementing:<div><br><div>【1】</div><div>







<p class="">>>> a = Edge(1,2,3,4)</p>
<p class="">>>> a.length</p>
<p class="">1</p></div><div>if I remove  '@property' in my code, it returns as below:</div><div>







<p class="">>>> a = Edge(1,2,3,4)</p>
<p class="">>>> a.length</p>
<p class=""><bound method Edge.length></p><p class="">>>> a.length()</p><p class="">








</p><p class="">1</p><p class=""><br></p><p class=""><br></p></div><div>I don't really understand the differences w/ @property, and the differences of a.length and a.length(), could you explain?<br></div><div><br></div>

<div>【2】</div><div><br></div><div>In SuffixTree, I define two functions, _get_str_from_edge, _get_str_from_node, the latter depend on the first one (please see my code).  Then I have this problem:</div><div>







<p class="">>>> a = SuffixTree('abcd')</p><p class="">>>> a._get_str_from_edge(a.edges[(0,1)])</p><p class="">








</p><p class="">'abcd$'</p><p class="">







</p><p class="">>>> a._get_str_from_node(0,1)</p><p class="">












</p><p class="">TypeError: _get_str_from_edge() takes exactly 2 arguments (3 given)<br></p><p class="">Could you tell me what's wrong here?</p><p class=""><br></p><p class=""><br></p></div><div><br></div><div>below is my code, __repr__ are removed for convenience.</div>

<div>###################################</div><div><br></div><div><br><div><div>class Node:</div><div><br></div><div>    def __init__(self, parent_node):</div><div>        self.suffix_node = -1  </div><div>        self.parent = parent_node</div>

<div>        self.children = []</div><div><br></div><div>    def add_child(self, child_node_index):</div><div>        self.children.append(child_node_index)</div><div><br></div><div>class Edge:</div><div><br></div><div>    def __init__(self, first_char_index, last_char_index,\</div>

<div>            source_node_index, dest_node_index):</div><div>        self.first_char_index = first_char_index</div><div>        self.last_char_index = last_char_index</div><div>        self.source_node_index = source_node_index</div>

<div>        self.dest_node_index = dest_node_index</div><div><br></div><div>    @property</div><div>    def length(self):</div><div>        return self.last_char_index - self.first_char_index</div><div><br></div><div>class SuffixTree:</div>

<div><br></div><div>    def __init__(self, string):</div><div>        self.string = string+'$'</div><div>        self.N = len(self.string) </div><div>        self.nodes = []</div><div>        self.num_nodes = 0</div>

<div>        self.edges = {}</div><div>       </div><div>        #initialize two node tree</div><div><br></div><div>        root = Node(-1)</div><div>        root.suffix_node = -1</div><div>        self._add_node(root)</div>

<div><br></div><div>        leaf = Node(0)</div><div>        leaf.suffix_node = 0 </div><div>        self._add_node(leaf)</div><div>        self.nodes[0].add_child(1)</div><div><br></div><div>        edge = Edge(0, self.N, 0, 1) </div>

<div>        self._add_edge(edge)</div><div><br></div><div>    def _get_str_from_edge(self, edge):</div><div>        return self.string[edge.first_char_index : edge.last_char_index]</div><div><br></div><div>    def _get_str_from_node(self, source_node_index, dest_node_index):</div>

<div>        return self._get_str_from_edge(self, self.edges[(source_node_index, \</div><div>                dest_node_index)])</div><div>    </div><div>    </div><div>    def _add_node(self, node):</div><div>        self.nodes.append(node)</div>

<div>        self.num_nodes += 1</div><div><br></div><div>    def _add_edge(self, edge):</div><div>        self.edges[(edge.source_node_index, edge.dest_node_index)] = edge</div><div>        self.nodes[edge.source_node_index].add_child(edge.dest_node_index)</div>

<div>        self.nodes[edge.dest_node_index].parent = edge.source_node_index</div><div><br></div><div><br></div><div><br></div><div><br></div><div>    </div><div><br></div></div></div></div></div>