首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们在python中使用多态性和抽象类?

为什么我们在python中使用多态性和抽象类?
EN

Stack Overflow用户
提问于 2019-12-13 13:54:08
回答 1查看 614关注 0票数 0

我第一次在c++中学习了多态性,在c++中,每个变量都有类型。所以我们使用多态性来获得一个指针,它可以指向不同类型的对象,而且我们可以很好地使用它们。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 15:25:27

您不明白什么是多态(我指的是OO多态分派)。多态是一种让不同类型的对象理解相同消息的能力,因此您可以以同样的方式使用这些对象,而不必担心它们的具体类型。

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

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

Python是动态类型的,主要依赖于“鸭子类型”(如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它就是一只鸭子--或者至少它是“一种鸭子”)。在Python文档中,您经常会发现类似于" file - like“或"dict-like”的术语,意思是“任何与文件(或dict)具有相同接口的东西”,并且相当多的“接口”或多或少是(或者至少很久以前)是隐式的。

这些隐式接口的问题是,它们很少有完整的文档记录,有时还必须使用函数源代码来准确地了解传递的对象需要支持什么。这就是为什么abc模块在python 2中引入并在python 3中得到改进的原因之一:通过创建一个明确定义接口的抽象基类型来更好地记录这些隐式接口。

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

C++中的继承与类有相同的问题:它既是定义接口,也是定义实现。这增加了混乱..。Java有一个好主意(IMHO)将抽象类型从实现中分离出来,但它没有一直坚持并将类型限制在接口上--您可以使用类或接口来进行类型声明,所以它仍然没有明确区分。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59323957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档