self [identifier] = some_value在这段代码中做了什么?

时间:2016-08-03 19:33:23

标签: python

我只是想在Python中学习K-ary树实现并遇到了这个链接: http://www.quesucede.com/page/show/id/python-3-tree-implementation

在tree.py文件中,有一段代码如下:

undefined method

什么是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作为列表的文档吗?

2 个答案:

答案 0 :(得分:3)

在完整的示例代码中,这是重要的一点:

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

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

这两个“魔术方法”__getitem____setitem__允许使用foo[key]语法像列表或字典一样访问类。

因此,在您的情况下,如果fooTree个实例,则foo["a"] = "b"__setitem__执行key "a"并{ {1}}为item,因此在"b"词典中将key映射到item

答案 1 :(得分: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]