目录

Mix-in组件制作工具类的多重继承

概述

尽管 Python 有很多内置的编程机制可以使得开发者实现多重继承,但是在实际工作中应该尽可能避开多重集成。如果一定要利用多重集成所带来的便利和封装性,那就可以考虑使用 mix-in 类。它是一种小型的类,只定义其他类可能需要提供的一套附加方法,而不定义自己的实例属性,也不需要使用者来调用其 __init__ 方法。

例子

例如,需要把内存中的 Python 对象转换为字典形式,以便把它进行序列化,那不妨把这部分改写成更加通用的代码,供其他类使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class ToDictMixin(object):
    def to_dict(self):
        return self._traverse_dict(self.__dict__)

    def _traverse_dict(self, instance_dict):
        output = {}
        for key, value in instance_dict.items():
            output[key] = self._traverse(key, value)
        return output

    def _traverse(self, key, value):
        if isinstance(value, ToDictMixin):
            return value.to_dict()
        elif isinstance(value, dict):
            return self._traverse_dict(value)
        elif isinstance(value, list):
            return [self._traverse(key, i) for i in value]
        elif hasattr(value, '__dict__'):
            return self._traverse(value.__dict__)
        else:
            return value


class BinaryTree(ToDictMixin):
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right


if __name__ == '__main__':
    tree = BinaryTree(10,
                      left=BinaryTree(7, right=BinaryTree(9)),
                      right=BinaryTree(13, left=BinaryTree(11)))
    print tree.to_dict()

上述代码中,定义一个 ToDictMinin 的类

参考资料

  1. Effective Python
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。