2016-08-03 11 views
6

IちょうどPythonでK分木の実装を習得しようとすると、このリンクに出くわした:tree.pyファイルで http://www.quesucede.com/page/show/id/python-3-tree-implementationこのコードでself [identifier] = some_valueは何をしますか?

、このようなコードのセクションがあります:

class Tree: 

    def __init__(self): 
     self.__nodes = {} 

    @property 
    def nodes(self): 
     return self.__nodes 

    def add_node(self, identifier, parent=None): 
     node = Node(identifier) 
     self[identifier] = node 

     if parent is not None: 
      self[parent].add_child(identifier) 

     return node 

    # ... ... 

    def __getitem__(self, key): 
     return self.__nodes[key] 

    def __setitem__(self, key, item): 
     self.__nodes[key] = item 

self[identifier]とは何ですか?それはリストですか?これは本当に混乱しています。 誰かが自己をリストとして使用することに関するいくつかの文書を説明したり指摘したりすることができますか?完全なコード例で

+3

このクラスには__getitem__が定義されていますか? '__getitem__'が何をしているのかを見ることなくあなたの質問に答えることはできません – inspectorG4dget

+0

また、項目の検索の代わりに項目の割り当てのために呼び出される' __setitem__'もあります。 – user2357112

+0

[setitemとgetitem - python]の重複している可能性があります(http://stackoverflow.com/questions/20356401/setitem-and-getitem-python) –

答えて

3

、これは重要なビットである:

def __getitem__(self, key): 
    return self.__nodes[key] 

def __setitem__(self, key, item): 
    self.__nodes[key] = item 

これらの2つの「魔法の方法」、__getitem____setitem__、クラスがリストまたは辞書のようにアクセスすることを可能に用いて、あろうfoo[key]構文。

fooTreeインスタンスだったのであれば、あなたのケースでは、foo["a"] = "b"は、結果的にself.__nodes辞書にitemkeyをマッピングし、"a""b"などitemとしてkey__setitem__を実行します。

+0

Okaayy ...そのような方法で辞書をオブジェクトとして扱ったことがないので、その部分を見落としました。ありがとう! –

1

彼らは__getitem__魔法を使用しています。このメソッドはクラスで使用され、そのインスタンスで[](インデクサ)演算子を使用してリストの索引付け、辞書の検索、値の範囲へのアクセスを行うことができます。

休止状態のサンプルでは、​​頭や尾のようないくつかの機能が追加されたリストがあります。例:here

class FunctionalList: 
    '''A class wrapping a list with some extra functional magic, like head, 
    tail, init, last, drop, and take.''' 

    def __init__(self, values=None): 
     if values is None: 
      self.values = [] 
     else: 
      self.values = values 

    def __len__(self): 
     return len(self.values) 

    def __getitem__(self, key): 
     # if key is of invalid type or value, the list values will raise the error 
     return self.values[key] 

    def __setitem__(self, key, value): 
     self.values[key] = value 

    def __delitem__(self, key): 
     del self.values[key] 

    def __iter__(self): 
     return iter(self.values) 

    def __reversed__(self): 
     return FunctionalList(reversed(self.values)) 

    def append(self, value): 
     self.values.append(value) 
    def head(self): 
     # get the first element 
     return self.values[0] 
    def tail(self): 
     # get all elements after the first 
     return self.values[1:] 
    def init(self): 
     # get elements up to the last 
     return self.values[:-1] 
    def last(self): 
     # get last element 
     return self.values[-1] 
    def drop(self, n): 
     # get all elements except first n 
     return self.values[n:] 
    def take(self, n): 
     # get first n elements 
     return self.values[:n] 
関連する問題