# -*- encoding: utf-8 -*-
import collections
'''
第28条: 继承collections.abc以实现自定义的容器类型
关键:
1 下标访问元素
原理: 假设bar是一个列表,将bar[0]转换为
bar.__getitem__(0)
所以当自己实现__getitem__方法,就可以使类的行为表现得和序列一样
要向使内置的len函数正常,需要实现__len__方法
2 collections.abc
作用: 定义了抽象基类,提供每种容器类型具备的常用方法
子类如果忘记实现某个方法,就会报错
3 总结
如果定制子类简单,可以继承python的容器类型
如果比较复杂,可以从collections.abc模块的抽象基类中继承
参考:
Effectiv Python 编写高质量Python代码的59个有效方法
'''
class BinaryNode(object):
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
class IndexableNode(BinaryNode):
def _search(self, count, index):
# return (found, count)
pass
def __getitem__(self, index):
found, _ = self._search(0, index)
if not found:
raise IndexError('Index out of range')
return found.value
class SequenceNode(IndexableNode):
def __len__(self):
_, count = self._search(0, None)
return count
def getTree():
tree = IndexableNode(
10,
left=IndexableNode(
5,
left=IndexableNode(2),
right=IndexableNode(6, right=IndexableNode(7))),
right=IndexableNode(
15,
left=IndexableNode(11)
)
)
return tree
# class BadType(collections.abc)
def process():
tree = getTree()
print 'LRR={value}'.format(
value=tree.left.right.right.value
)
# print "Index 0 ={value}".format(
# value=tree[0]
# )
if __name__ == "__main__":
process()
Effective Python 读书笔记: 第28条: 继承collections.abc以实现自定义的容器类型
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/88932377
今日推荐
周排行