【问题标题】:why we use polymorphism and abstract classes in python为什么我们在 python 中使用多态性和抽象类
【发布时间】:2020-04-06 23:43:09
【问题描述】:

我首先在 C++ 中学习了多态性,在 C++ 中,我们为每个变量设置了类型。所以我们使用多态性来获得一个可以指向不同类型对象的指针,我们可以很好地使用它们。

但我在 python 中没有得到多态性和抽象类。在这里,每个变量都可以是一切。它可以是迭代器、列表、单个变量或函数。一切。那么是什么让程序员在这里使用抽象类或使用多态呢?

在 c++ 中,我们以多种方式使用继承。但是在python中,它只是用来使用另一个类的方法或属性。我对吗?怎么了?

【问题讨论】:

  • 与我们在其他语言中使用多态性和抽象类的原因相同:根据对象的类型做不同的事情,并在多个具体类之间共享通用的实现细节。

标签: python oop inheritance polymorphism


【解决方案1】:

你不明白什么是多态(我的意思是 OO 多态调度)。多态性是让不同类型的对象理解相同消息的能力,因此您可以以相同的方式使用这些对象,而不必担心它们的具体类型。

C++ 实际上使用相同的概念(类)来表示两种略有不同的语义:抽象类型(接口)是该类型的对象理解的消息集)和具体类型(实现),它定义了该类型如何对这些消息做出反应。

Java 清楚地区分抽象类型 (interface) 和具体类型 (class)。

Python 是动态类型的,主要依赖于“鸭子类型”(如果它像鸭子一样走路并且像鸭子一样嘎嘎叫,那么它就是鸭子——或者至少它足够“鸭子的种类”)。你会经常在 Python 文档中找到像“file-like”或“dict-like”这样的术语,意思是“任何与文件(或 dict)具有相同接口的东西”,并且相当多的“接口”是(或在至少长期以来)或多或少是隐含的。

这些隐式接口的问题在于它们很少有完整的文档记录,有时必须访问函数源代码才能确切找出传递的对象需要支持什么。这就是在 python 2 中引入 abc 模块并在 python 3 中改进的原因之一:作为一种通过创建明确定义接口的抽象基类型来更好地记录这些隐式接口的方法。

抽象基类的另一个原因(无论是否使用 abc 模块)是为一组具体的子类提供一个通用的基实现。这对于框架特别有用,即 Django 的 models.Model (ORM) 或 forms.Form(用户输入收集和验证)类 - 在这两种情况下,只需定义数据库或表单字段就足以让某些东西正常工作。

C++ 中的继承存在与类相同的问题:它既用作定义接口又用作实现。这增加了混乱...... Java有一个好主意(恕我直言)将抽象类型与实现分开,但未能一路走并将类型限制为接口 - 您可以使用类或接口进行类型声明,所以它仍然没有明确区分。

在 Python 中,由于我们没有静态类型,因此继承实际上主要是关于实现重用。 abc 模块允许您将完全不相关的类(无继承关系)注册为已定义抽象基本案例的子类型,但这里的重点主要是记录您的类实现了相同的接口(这不是偶然的.. .)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    相关资源
    最近更新 更多