【问题标题】:Basic usage of python class inheritancepython类继承的基本用法
【发布时间】:2011-10-09 21:00:48
【问题描述】:

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

我的程序目前有两个类,分别称为PlannerModelPlanner 与模型无关,因为它使用的任何Model 都提供一致的接口。因此,似乎如果我想要几个不同的可用模型,它们都应该从 something 继承,以强制执行一致的接口。此外,一些模型类将共享功能。例如,singleAgent 模型可能会模拟一个代理,而双代理模型会模拟两个代理,每个代理的行为都与 singleAgent 相似。

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

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

我查看了其他一些带有类似标签的问题,但它们似乎更关心语法而不是设计选择。我还查看了classes 上的官方 Python 文档,但没有找到我要查找的内容。 (可能是因为我知道的不够多,无法识别它。)

【问题讨论】:

    标签: python oop class inheritance


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      Python 的优点之一(以及许多人认为的缺点)是它不依赖编译时类型检查来强制执行接口。这意味着一组对象不需要为了拥有相同的接口而从一个公共基类继承——它们仍然可以在任何函数中互换使用。这种行为通常称为duck typing

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

      为了更进一步,如果您应该在第三方库中有一些不相关的对象类型超出您的控制范围,您希望将其用作Model,您甚至可以执行"monkey patching" or "duck punching" in为了添加提供Model 接口所需的代码!

      【讨论】:

        【解决方案3】:

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

        class Model:
            pass
        
        class singleAgent(Model):
            pass
        

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

        【讨论】:

        • 对不起 - 我应该让我的问题更清楚。我打算为什么/何时在 Python 中使用 OOP 功能,而不一定如何。如果我遵循我的第一个猜测,我会得到一些严重的非 Python 代码,并且让自己的事情变得比必要的困难得多。
        猜你喜欢
        • 1970-01-01
        • 2013-03-15
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多