看看你周围的物理对象,你能否用继承层级的方式描述它们?几个世纪以来,人类都是以这样的分类方法划分世界的,所以这应该并不难。这些对象的类之间有没有不那么明显的继承关系?如果你要在计算机应用中模拟这些物体,它们应该共享哪些属性和方法?哪些可以多态地重写?哪些属性应该完全不同?
现在,写一些代码。但不是为物理对象的继承层级,那很无聊。通常物理对象的属性要比方法多。想一下过去你一直想做但没机会动手的一个宠物编程项目,不管你想要解决什么样的问题,试着考虑用一些基本的继承关系,然后实现它们。同时,要注意那些不需要用到继承的关系。有哪些地方你需要用到多重继承吗?你确定吗?你能找到其他需要用到混入的地方吗?试着快速写出一个原型。不需要真的有用甚至也不需要能运行。你已经知道怎样通过python-i来测试代码,只需要写一些代码并在交互式解释器中测试即可。如果能运行,就再写一些,如果不能,就修复错误!
现在再回头看看这个距离算法的案例。我们需要能够用其中的代码给测试样本分类,也需要能够为用户提供的未知样本分类。这两种样本有什么共同点?你是否可以创建一个通用的父类,并让这两种样本继承自这个父类(我们还没有仔细研究KNN分类算法,但你可以创建一个模拟分类器提供假的答案)?
在距离算法的示例中,我们可以看到Hyperparameter是一个组合,距离算法是它的参数之一,是一个可以被灵活替换的插件(plug-in)。在这种情况下,是否可以使用混入?为什么可以,为什么不可以?混入有哪些插件没有的限制?