Effective Python 读书笔记: 第28条: 继承collections.abc以实现自定义的容器类型

# -*- 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() 

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/88932377