这段代码中的self[identifier] = some_value是什么意思?

6

我刚想学习Python中的K叉树实现,发现了这个链接:http://www.quesucede.com/page/show/id/python-3-tree-implementation

在tree.py文件中,有这样一段代码:

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]?它是一个列表吗?这真的很令人困惑。有人能解释一下并/或者给我一些使用self作为列表的文档吗?

3
这个类中定义了 __getitem__ 吗?如果不看 __getitem__ 的实现,我们无法回答你的问题。 - inspectorG4dget
此外,__setitem__ 用于项目赋值而不是项目检索。 - user2357112
可能是setitem和getitem - python的重复问题。 - OneCricketeer
更新了完整的代码。谢谢管理员。 - Rahul Sarma
self 只是一棵树,self.__nodes 是一个字典。self['value'] 使用了 __getitem__ - OneCricketeer
2个回答

3
在完整的示例代码中,这是重要的部分:
def __getitem__(self, key):
    return self.__nodes[key]

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

这两个"神奇方法",__getitem____setitem__,使得类可以像列表或字典一样被访问,使用 foo[key] 语法。
因此,在您的情况下,如果 foo 是一个 Tree 实例,foo["a"] = "b" 将执行 __setitem__,其中 key"a"item"b",将 key 映射到 itemself.__nodes 字典中。

好的...以前从未以字典对象的方式工作过,所以忽略了那一部分。谢谢! - Rahul Sarma

1
他们正在使用__getitem__魔术方法。该方法用于类中,允许其实例使用[](索引器)运算符进行列表索引、字典查找或访问值范围。
在下面的示例中,我们有一个具有一些额外功能的列表,例如head和tail。示例取自这里
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接