Python | 多态(Python多态的简单例子)
off999 2024-10-25 13:42 15 浏览 0 评论
多态体现一,变量可以指向任意数据类型
多态的第一种体现是,不关注对象的数据类型,同一个变量完全可以在不同的时间引用不同的对象
Python 本身就是一种多态语言,不关心对象的类型
- 对于弱类型的语言来说,变量并没有声明类型,因此同一个变量完全可以在不同的时间引用不同的对象
- 毫无疑问,在 Python 中,对象是一块内存,内存中除了包含属性和方法之外,还包含了对象类型。我们通过引用来访问对象,比如 a = A()。首先,Python 创建一个对象 A,然后声明一个变量 a,再将变量 a 与对象 A 联系起来。变量 a 是没有类型的,它的类型取决于其关联的对象。
a = 10
a = 'alex' # Python中的变量可以随时被赋值任意数据类型
我们曾经谈到过,Python 中的每一个类实际上就是一个数据类型,因此,变量也可以指向不同类的对象:
class Bird:
def move(self, field):
print('鸟儿在%s上自由地飞翔~' % field)
class Dog:
def move(self, field):
print('狗狗在%s里飞快地奔跑~' % field)
x = Bird()
x.move('天空')
x = Dog()
x.move('草地')
输出的结果为:
鸟儿在天空上自由地飞翔~
狗狗在草地里飞快地奔跑~
同一个变量 x 在执行同一个 move() 方法时,由于 x 指向的对象不同,因此呈现出不同的行为特征,这就是多态。
多态体现二,一类事物有多种形态(Polymorphic)
一个抽象类有多个子类,但方法实现不同
- 例如:动物类有多个子类,每个子类都重新实现了父类的某个方法,但方法的实现不同(比如动物类都有休息的方法,但不同的动物休息的方式不尽相同)
- 此时需要有继承,需要方法重写
class Girl(object):
def __init__(self, name):
self.name = name
def game(self):
print('%s蹦蹦跳跳地玩耍...' % self.name)
class Nurse(Girl):
def game(self):
print('%s脱裤子打针' % self.name)
class Boy(object):
def __init__(self, name):
self.name = name
def game(self, girl):
print('%s和%s快乐地玩耍' % (self.name, girl.name))
girl.game()
xiaoming = Boy('小明')
xiaohong = Girl('小红')
xiaoli = Nurse('小丽')
xiaoming.game(xiaohong)
xiaoming.game(xiaoli)
输出的结果为:
小明和小红快乐地玩耍
小红蹦蹦跳跳地玩耍...
小明和小丽快乐地玩耍
小丽脱裤子打针
Nurse 有 Girl 类的方法和属性,是它的子类。方法名虽然相同,但实现的方式略有差异。具有相同父类,继承相同方法,在子类中对父类的方法进行了修改,就是多态的第二种体现。
多态性
多态性(polymorphism)指的是,在多态基础上,定义统一的共同接口(在类的外面定义单独的函数),从而实现使用一个函数调用不同类的同名方法。
不同类的对象作为函数的参数时,因为方法不同,得到的结果也会有差异。
多态性的具体实现方法如下:
class Person:
def relax(self):
print('人需要休息')
class Alex:
def relax(self):
print('睡觉')
class BigB:
def relax(self):
print('买沙发')
# 定义一个函数作为访问多个类的relax方法的统一接口
def relax_func(person):
person.relax()
a = Alex()
b = BigB()
p = Person()
relax_func(a)
relax_func(b)
relax_func(p)
输出的结果为:
睡觉
买沙发
人需要休息
鸭子类型
鸭子类型是 Python 中比较推崇的多态的另一种体现形式。
鸭子类型不关心类型,不需要继承,只关注方法的实现,这种情况被称为鸭子类型。
鸭子类型名字的来源于一句话:“当看到一只鸟走起来像鸭子、游起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称作‘鸭子’”。
套用过来就是,当两个类,有同名方法,不管这两个类是干什么用的,也不管它们之间有没有联系(依赖、组合或继承),都可以用同一个接口来调用。
在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。
比如,人、鸭子、鱼、猪和船都会游泳,但是他们是不同的类,他们之间没有任何联系。而我们却可以在外面定义一个统一的接口来调用他们之间游泳的方法:
class Person:
def swim(self):
print('人可以游泳')
class Duck:
def swim(self):
print('鸭子会游泳')
class Fish:
def swim(self):
print('鱼会游泳')
class Pig:
def swim(self):
print('猪会游泳')
class Ship:
def swim(self):
print('船会游泳')
# 建立鸭子类型
def swimming(obj):
obj.swim()
xiaoming = Person()
xiaohuang = Duck()
paopao = Fish()
peiqi = Pig()
titanic = Ship()
swimming(xiaoming)
swimming(xiaohuang)
swimming(paopao)
swimming(peiqi)
swimming(titanic)
输出的结果为:
人可以游泳
鸭子会游泳
鱼会游泳
猪会游泳
船会游泳
多态总结
Python 是一门天然支持多态的编程语言。
多态增加了程序的灵活性(通用性),以不变应万变,不论对象千变万化,使用者都是使用同一种形式(外部定义的一个函数)去调用。
增加程序的可扩展性,通过继承某个类创建的一个新类,接口使用者无需更改自己的代码,还是用原方法调用。
多态和多态性对比:
多态强调的是,一类事物由不同的形态。
多态性强调的是,同一操作,作用对象不同,表现出不同的实现方式(只关心行为结果)
相关推荐
- python gui编程框架推荐以及介绍(python gui开发)
-
Python的GUI编程框架有很多,这里为您推荐几个常用且功能强大的框架:Tkinter:Tkinter是Python的标准GUI库,它是Python内置的模块,无需额外安装。它使用简单,功能较为基础...
- python自动化框架学习-pyautogui(python接口自动化框架)
-
一、适用平台:PC(windows和mac均可用)二、下载安装:推荐使用命令行下载(因为会自动安装依赖库):pipinstallPyAutoGUI1该框架的依赖库还是蛮多的,第一次用的同学耐心等...
- Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
-
大数据文摘受权转载自AI前线整理|褚杏娟近期,HuggingFace低调开源了一个重磅ML框架:Candle。Candle一改机器学习惯用Python的做法,而是Rust编写,重...
- Flask轻量级框架 web开发原来可以这么可爱呀~(建议收藏)
-
Flask轻量级框架web开发原来可以这么可爱呀大家好呀~今天让我们一起来学习一个超级可爱又实用的PythonWeb框架——Flask!作为一个轻量级的Web框架,Flask就像是一个小巧精致的工...
- Python3使用diagrams生成架构图(python架构设计)
-
目录技术背景diagrams的安装基础逻辑关系图组件簇的定义总结概要参考链接技术背景对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能。这就像我们学习的时候整理的一些Xmi...
- 几个高性能Python网络框架,高效实现网络应用
-
Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框...
- Web开发人员的十佳Python框架(python最好的web框架)
-
Python是一种面向对象、解释型计算机程序设计语言。除了语言本身的设计目的之外,Python的标准库也是值得大家称赞的,同时Python还自带服务器。其它方面,Python拥有足够多的免费数据函数库...
- Diagram as Code:用python代码生成架构图
-
工作中常需要画系统架构图,通常的方法是通过visio、processon、draw.io之类的软件,但是今天介绍的这个软件Diagrams,可以通过写Python代码完成架构图绘制,确实很co...
- 分享一个2022年火遍全网的Python框架
-
作者:俊欣来源:关于数据分析与可视化最近Python圈子当中出来一个非常火爆的框架PyScript,该框架可以在浏览器中运行Python程序,只需要在HTML程序中添加一些Python代码即可实现。该...
- 10个用于Web开发的最好 Python 框架
-
Python是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还...
- 使用 Python 将 Google 表格变成您自己的数据库
-
图片来自Shutterstock,获得FrankAndrade的许可您知道Google表格可以用作轻量级数据库吗?GoogleSheets是一个基于云的电子表格应用程序,可以像大多数数据库管...
- 牛掰!用Python处理Excel的14个常用操作总结!
-
自从学了Python后就逼迫用Python来处理Excel,所有操作用Python实现。目的是巩固Python,与增强数据处理能力。这也是我写这篇文章的初衷。废话不说了,直接进入正题。数据是网上找到的...
- 将python打包成exe的方式(将python文件打包成exe可运行文件)
-
客户端应用程序往往需要运行Python脚本,这对于那些不熟悉Python语言的用户来说可能会带来一定的困扰。幸运的是,Python拥有一些第三方模块,可以将这些脚本转换成可执行的.exe...
- 对比Excel学Python第1练:既有Excel,何用Python?
-
背景之前发的文章开头都是“Python数据分析……”,使得很多伙伴以为我是专门分享Python的,但我的本意并非如此,我的重点还是会放到“数据分析”上,毕竟,Python只是一种工具而已。现在网上可以...
- 高效办公:Python处理excel文件,摆脱无效办公
-
一、Python处理excel文件1.两个头文件importxlrdimportxlwt其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入。2.读取exce...
你 发表评论:
欢迎- 一周热门
-
-
python 3.8调用dll - Could not find module 错误的解决方法
-
加密Python源码方案 PyArmor(python项目源码加密)
-
Python3.8如何安装Numpy(python3.6安装numpy)
-
大学生机械制图搜题软件?7个受欢迎的搜题分享了
-
编写一个自动生成双色球号码的 Python 小脚本
-
免费男女身高在线计算器,身高计算公式
-
将python文件打包成exe程序,复制到每台电脑都可以运行
-
Python学习入门教程,字符串函数扩充详解
-
Python数据分析实战-使用replace方法模糊匹配替换某列的值
-
Python进度条显示方案(python2 进度条)
-
- 最近发表
-
- python gui编程框架推荐以及介绍(python gui开发)
- python自动化框架学习-pyautogui(python接口自动化框架)
- Python 失宠!Hugging Face 用 Rust 新写了一个 ML框架,现已低调开源
- Flask轻量级框架 web开发原来可以这么可爱呀~(建议收藏)
- Python3使用diagrams生成架构图(python架构设计)
- 几个高性能Python网络框架,高效实现网络应用
- Web开发人员的十佳Python框架(python最好的web框架)
- Diagram as Code:用python代码生成架构图
- 分享一个2022年火遍全网的Python框架
- 10个用于Web开发的最好 Python 框架
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)