我只是想学习用Python语言实现K-ary树,偶然发现了这个链接: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作为列表的文档吗?
发布于 2016-08-03 19:38:24
在完整的示例代码中,这是重要的一点:
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
映射到<代码>D14字典中的<代码>D13。
发布于 2016-08-03 19:58:21
他们正在使用__getitem__
的魔术方法。此方法在类中使用,以允许其实例使用indexer运算符进行列表索引、字典查找或访问值范围。
在休眠示例中,我们有一个列表,其中包含一些额外的功能,如头部和尾部。取自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]
https://stackoverflow.com/questions/38752193
复制