python如何使用多态_在python 3中,如何将多态应用于类

介绍

多态性是为不同的基础形式(例如,数据类型或类)利用同一接口的能力。这允许函数在不同时间使用不同类型的实体。

对于Python中的面向对象编程,这意味着可以用与属于特定类的特定对象相同的方式来使用它,就好像它是属于不同类的不同对象一样。

多态性提供了灵活性和松散的耦合,因此可以随时间扩展代码,并且轻松维护它们。

本教程将介绍如何将多态应用于Python中的类。

创建多态类

为了使用多态性,我们创建两个不同的类,用于两个不同的对象,每一个不同的类都需要有一个共同的接口,这样它们就可以被多态地使用,所以,我们为它们提供不同但有相同名称的方法。

我们创建一个Shark类和Clownfish类,每个类都将定义swim(),swim_backwards()和skeleton()的方法。polymorphic_fish.pyclass Shark():

def swim(self):

print("The shark is swimming.")

def swim_backwards(self):

print("The shark cannot swim backwards, but can sink backwards.")

def skeleton(self):

print("The shark's skeleton is made of cartilage.")

class Clownfish():

def swim(self):

print("The clownfish is swimming.")

def swim_backwards(self):

print("The clownfish can swim backwards.")

def skeleton(self):

print("The clownfish's skeleton is made of bone.")

上面的代码中,Shark和Clownfish类都有三个相同名称相同的方法,但是,这些方法的每个功能对于每个类都不同。

让我们将这些类实例化为两个对象:polymorphic_fish.py...

sammy = Shark()

sammy.skeleton()

casey = Clownfish()

casey.skeleton()

当使用python polymorphic_fish.py命令运行程序时,我们可以看到每个对象都按照预期的方式运行:OutputThe shark's skeleton is made of cartilage.

The clownfish's skeleton is made of bone.

现在,我们有两个使用通用接口的对象,无论它们的类型如何,我们都可以以相同的方式使用这两个对象。

多态性与类方法

为了展示Python如何以相同的方式使用这些不同的类类型,我们首先可以创建一个遍历对象元组的for循环。然后我们可以调用这些方法,而不用关心每个对象是什么类型的,我们仅假设这些方法实际上存在于每个类中。polymorphic_fish.py...

sammy = Shark()

casey = Clownfish()

for fish in (sammy, casey):

fish.swim()

fish.swim_backwards()

fish.skeleton()

我们有两个对象,Shark类的sammy和Clownfish类的casey ,我们的for循环迭代这些对象,在每个对象上调用swim(),swim_backwards()和skeleton()方法。

运行程序时,输出将如下所示:OutputThe shark is swimming.

The shark cannot swim backwards, but can sink backwards.

The shark's skeleton is made of cartilage.

The clownfish is swimming.

The clownfish can swim backwards.

The clownfish's skeleton is made of bone.

for循环首先通过Shark类的sammy实例化,然后是Clownfish类的casey对象,先看到与Shark类相关的方法。

这表明python在不知道或关心每个对象的类类型的情况下使用了这些方法,也就是说,以多态方式使用了这些方法。

函数的多态性

我们还可以创建一个可以接受对象的函数,从而实现多态。

我们创建一个叫in_the_pacific()的函数,它接受一个我们可以调用fish的对象,使用的是名称fish,实例化的对象都可以被调用到这个函数中:polymorphic_fish.py...

def in_the_pacific(fish):

接下来,我们给函数一些使用我们传递给它的fish对象的函数,在这种情况下,我们调用swim()方法,其中每个方法都在两个类Shark和Clownfish中定义:polymorphic_fish.py...

def in_the_pacific(fish):

fish.swim()

接下来,如果没有它们,我们创建Shark和Clownfish类的实例化,使用这些函数,我们可以使用相同的in_the_pacific()函数调用它们的操作:polymorphic_fish.py...

def in_the_pacific(fish):

fish.swim()

sammy = Shark()

casey = Clownfish()

in_the_pacific(sammy)

in_the_pacific(casey)

运行程序时,输出将如下所示:OutputThe shark is swimming.

The clownfish is swimming.

尽管我们在定义时将随机对象(fish )传递给in_the_pacific()函数,但是仍然能够有效地实例化Shark和Clownfish类,casey对象调用Clownfish类中的swim()方法,而sammy对象调用在Shark类中定义的swim()方法。

结束语

通过允许不同的对象通过多态的方式使用函数和方法,利用这个Python功能可为你的面向对象的代码提供更大的灵活性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python输出数字方阵_在python里输出数字方阵

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

python tkinter 弹窗_tkinter主窗口和子窗口同时弹出该怎么办?

参考代码注释import osfrom tkinter import filedialogimport tkinter as tkfrom tkinter import Buttonclass ReName():def __init__(self):self.n 0def shouldIgnore(self, path: str) -> bool:忽略以下路径:1. 文件夹。2. macOS 隐藏文件a. 文件名以 . 开头,…

安装mysql8.019命令符_MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干目录下载完成后解压解压完是这个样子配置初始化的my.ini文件的文件解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置:[mysqld]# …

python tcp服务器_python实现TCP服务器端与客户端的方法详解

本文实例讲述了python实现TCP服务器端与客户端的方法。分享给大家供大家参考。具体如下:TCP服务器程序(tsTserv.py):from socket import *from time import ctimeHOST PORT 21567BUFSIZ 1024ADDR (HOST, PORT)tcpSerSock socket(AF_INET, SOCK_STRE…

入Java_初入Java的方法

Java的方法类似于其他语言如C中的函数,比如我们第一个Java程序 输出Hello,world!中用到一个方法System.out.printfln();这里的printfln()就是一个方法,System是系统类,out是对象。1.什么是方法?方法是语句…

java method_JAVA Method的解析

java.lang.reflect.MethodMethodpublic final class Method extends Executable数据的层级结构Paste_Image.pngMethod中的方法boolean [equals].将此方法与指定的对象进行比较T extends [Annotation]T [getAnnotation]如果存在注释,则返回指定类型的注释否则返回为n…

java中this_多学习才能多赚钱之:java中this什么用

java中this什么用1、this调用当前属性:其主要作用是当需要给类中的数据进行初始化时,可以通过this来进行赋值,而不用随便定义一个变量来进行赋值,更有利于代码的阅读与理解(推荐教程:java教程)class Book{//定义书的类…

java api 英文_教你查阅Java API 英文文档(JDK 11)

然后找到“Specifications”并点击 API Documentation比如我们在别人的源码里看到了方法[也叫函数]: Scanner input new Scanner(System.in);所以搜索一下右上角 Scanner,对比我们看到的源码里import,发现是java.util包里的,所以…

jedis使用_Redis --Java客户端 Jedis

Redis --Java客户端 Jedis 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 Jedis: 一款java操作redis数据库的工具. 菜鸟教程文档地址 使用…

java jolt tuxedo_java使用jolt调用tuxedo服务

使用包jolt-1.0import bea.jolt.JoltSession;import bea.jolt.JoltSessionAttributes;import bea.jolt.SessionException;简单示例JoltSession jsession;JoltSessionAttributes sattr;JoltRemoteService joltRemoteService;JoltTransaction trans;String userName "A…

找出最具竞争力的子序列_力扣300——最长上升子序列

这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找。原题给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最…

java 跨站点脚本编制_AppScan跨站点脚本编制修复

查了下百度,跨站点脚本编制其实也就是在url后加入参数和js脚本实现一些坏坏的事情,至少appscan就是这么干的。那么主要的工作就是把恶意代码给过滤了,作为javaweb开发,明显第一步想到的是过滤器。网上很多都是将request对象 传入H…

python怎么安装本地的egg_python egg怎么安装

经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)开发的setuptools包里带的一个命令,它用来安装egg包。egg包是目前最流行的python应用打…

java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数

Javascript里的eval函数能动态执行一串js脚本。那Java里怎么做到呢。有两种方法:一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic static void main(String args[]){ScriptEngineManager manager new ScriptEngineManager();ScriptEngine se manager.getEngineB…

jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...

写在前面听闻大佬们在写一些框架或者库的时候,到处都隐藏了一些细节,所以阅读他们的源代码,无论从性能优化、还是JS API的学习、亦或是代码风格等方面给到我们很多启发。这两天我翻看了一下jQuery1.x的源代码,看到了这么一段&…

java connection 共享_java 使用HttpURLConnection发送数据简单实例

java 使用HttpURLConnection发送数据简单实例每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的…

mockito mock void方法_Spock如何模拟抽象类方法

我们平时写单元测试时经常会遇到调用抽象类或父类的方法,这些抽象方法可能是调用底层接口或数据库,需要mock掉,让抽象方法返回一个我们指定的值,以便测试当前代码逻辑的场景。下面讲下Spock如何结合power mock实现动态mock抽象方法…

new 实例化对象是啥意思_二. 初步认识JS中的类和对象

1 构造函数的定义在JS中, 没有类(class)的概念, 主要是通过构造函数来模拟的.语法function 构造函数名 () {// 函数体}使用function关键字表示定义一个构造函数构造函数名一般首字母大写示例function Person() {}通过以上方式就可以定义一个Person构造函数, 相当于定义好了一个…

java get 空指针_Java 中空指针处理方法

空指针异常(Null Pointer Exception)是我们平时最容易碰到的,也是最令人讨厌的异常。本文介绍如何避免出现空指针异常。首先我们看如下的示例:private Boolean isFinished(String status) {if (status.equalsIgnoreCase("Finish")) {return Bo…

正则匹配问号_爬虫之正则表达式

1什么是正则表达式正则表达式,也称规则表达式(Regular Expression,在代码中常简写为RE)。2为什么使用用来匹配、替换一类具有相同规则字符串3使用规则3.1单字符:3.2数量修饰:3.3边界:3.4分组:3.…