我只是想在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作为列表的文档吗?
答案 0 :(得分: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"
并{ {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]