python类继承的基本用法

时间:2011-10-09 21:00:48

标签: python oop class inheritance

我刚刚开始使用Python,并试图找出使用类的正确方法。

我的程序目前有两个类,称为PlannerModelPlanner与模型无关,因为它使用的任何Model都提供了一致的接口。所以,似乎我想拥有几个不同的可用模型,它们都应该继承自某些东西,以强制实现一致的界面。此外,一些Model类将共享功能。例如,singleAgent模型可以模拟一个代理,而doubleAgent模型可以模拟两个代理,每个代理的行为与singleAgent类似。

那么 - 我该如何实现这个/我需要什么语言功能呢?

编辑:感谢快速反应让我了解鸭子课程!所以,如果我想覆盖另一个Model功能的子集,听起来我只会使用继承? (对于我的doubleAgent,我可能只使用singleAgents作为班级成员?)

<子> 我已经看了一些其他类似标签的问题,但他们似乎更关心语法而不是设计选择。我还查看了classes上的官方Python文档,但没有找到我正在寻找的内容。 (可能是因为我不太了解它。)

3 个答案:

答案 0 :(得分:3)

在Python中,您通常不会像使用静态类型语言那样使用与OOP完全相同的方法。具体来说,您实际上并不需要一个对象来实现特定的接口或从一个抽象的基类派生等等。相反,该对象只需要能够执行所需的操作。这通俗地称为鸭子打字。如果它像鸭子一样走路,然后就像鸭子那样说话,那么它就是一只鸭子。

因此,只需确定对象需要哪些方法,并确保它们始终拥有它们。如果您希望在系统中的不同actor之间共享实现,那么您可以考虑类继承。但如果没有,那么你也可以实现不相交的类层次结构。

答案 1 :(得分:2)

Python的优势之一(并且,正如许多人认为的那样,弱点)是它不依赖于编译时类型检查来强制执行接口。这意味着,为了拥有相同的接口,一组对象继承公共基类所需的 - 它们仍然可以在任何函数中互换使用。此行为通常称为duck typing

事实上,因为Python是动态类型的,所以你很难“强制执行一致的界面”,正如你所说的那样。出于这个原因,已经创建了zope.interface之类的东西。在您的情况下,您将从类中获得的主要好处是代码重用 - 如果所有Model类型都实现了某些常见行为。

为了更进一步,如果您希望用作Model的第三方库中存在一些不相关的对象类型,您甚至可以执行所谓的{{{ 3}}以添加提供Model界面所需的代码!

答案 2 :(得分:0)

基本上,您在Python中使用Classes提供的链接可以在有关继承的部分中回答您的所有问题。 在您的情况下,只需定义一个名为Model的类,然后定义两个子类:singleAgent和doubleAgent。:

class Model:
    pass

class singleAgent(Model):
    pass

如果你真的,真的需要抽象类来看看“抽象基类”es:http://docs.python.org/library/abc.html