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

2024-04-27 03:26:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在c++中,我们在许多方面使用了继承。但在python中,它只是用来使用另一个类方法或属性。我说得对吗?怎么了?你知道吗


Tags: 对象方法函数类型列表属性抽象类程序员
1条回答
网友
1楼 · 发布于 2024-04-27 03:26:11

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

C++实际上使用相同的概念(类)来表示两种稍微不同的语义:抽象类型(接口),即该类型对象的消息集)和定义该类型如何对这些消息作出反应的具体类型(实现)。你知道吗

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

Python是动态类型的,主要依赖于“duck-typing”(如果它像鸭子一样走路,像鸭子一样呱呱叫,那么它就是鸭子——或者至少它是“kind-a-duck”就足够了)。在Python文档中,您经常会发现类似于“file like”或“dict like”的术语,意思是“任何与文件(或dict)具有相同接口的东西”,并且相当多的“接口”或多或少都是隐式的(或者至少长期是隐式的)。你知道吗

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

抽象基类(无论是否使用abc模块)的另一个原因是为一组具体的子类提供公共的基类实现。这对于框架特别有用,比如Django的models.Model(ORM)或forms.Form(user input collection and validation)类——在这两种情况下,仅仅定义数据库或表单字段就足以让某些东西正常工作。你知道吗

<> C++中的继承与类相同,它既定义接口又实现实现。这增加了混乱。。。Java有一个好主意(IMHO)将抽象类型与实现分离,但未能将类型限制在接口上—您可以使用类或接口来声明类型,因此它仍然没有明确区分。你知道吗

在Python中,由于没有静态类型,继承实际上主要是实现重用。abc模块允许您注册完全不相关的类(没有继承关系)作为已定义的抽象基类的子类型,但这里的重点主要是记录您的类实现了相同的接口(这不是偶然的…)。你知道吗

相关问题 更多 >