概述
尽管 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
的类
参考资料
- Effective Python
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。