I was just trying to learn K-ary tree implementation in Python and came across this link: http://www.quesucede.com/page/show/id/python-3-tree-implementation
In the tree.py file, there is a section of code like this:
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
What is self[identifier]? Is it a list? This is really confusing.
Can someone explain and/or point me to some documentation of using self as a list?
In the full example code, this is the important bit:
def __getitem__(self, key):
    return self.__nodes[key]
def __setitem__(self, key, item):
    self.__nodes[key] = item
These two 'magic methods', __getitem__ and __setitem__, allow the class to be accessed like a list or dictionary would be, using the foo[key] syntax.
So, in your case, if foo was a Tree instance, foo["a"] = "b" would execute __setitem__ with key as "a" and item as "b", consequently mapping key to item in the self.__nodes dictionary.
They are using the __getitem__ magic method. This method is used in a class to allow its instances to use [] (indexer) operators for list indexing, dictionary lookups, or accessing ranges of values.
In the fallowing sample, we have a list with some extra functionality like head and tail. Example taken from 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]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With